2017-08-21 18 views
0

私は、ファイル(モジュール)間の可変要素を参照によって共有する方法を探している初心者です。例えば、私のここでのjavascript node.jsモジュール間の可変共有

const users = {}, 
    waitingQueue = [] 
module.exports = function(io){ 
    io.on('connection', (socket)=>{ 
     users[socket.id] = socket 
     socket.on("Search", (d, ack)=>{ 
      waitingQueue.push(socket) 
      // logic with waitingQueue 
      // logic with users {} 
     }) 
     socket.on("otherEvent", (d, ack)=>{ 
        // logic with waitingQueue 
        // logic with users {} 
      }) 
    }) 
} 

今私はmodulewiseそれを分割したいと思いapp.jsです。今differenct場合は、新しいapp.js

const users = {}, 
    waitingQueue = [] 
const Search = require('./search') 

module.exports = function(io){ 
    io.on('connection', (socket)=>{ 
     users[socket.id] = socket 
     socket.on("Search", Search(users, waitingQueue)) 
    }) 
} 

私の悩み

socket.on( "検索"、...)

は...目的球

する必要があります今では使用しなencloser

場合

cket.on( "検索"、()=> ...)

輸出修正{ユーザーは、waitingQueue}フォームSearch.jsはOKですが、& waitingQueueはなく、働いていないvariblesユーザーをオーバーライドする必要があります。 私はこれらの変数を他のモジュールとも共有する必要があります。

また、イベントエミッタベースのアプローチObject.observe()を試しても問題を解決することはできません。 誰も私が

答えて

2

さて、この問題を解決するためにPLSの助け、私の推測は、実際のアプリケーションでusers & waitingQueueある永続ストレージなどのいくつかの並べ替えから来ますデータベースであるため、モジュール間でデータを共有するという考え方は、DBから直接取得する可能性が高いため、問題はありません。

しかし、異なるモジュール間で共有したいメモリ内の「グローバル」データがあった場合、それを自分のモジュールに移動する可能性が最も高いと思います。

data.js

module.exports = { 
    users: {}, 
    waitingQueue: [] 
} 

app.js

const Search = require('../search'); 
const data = require('./data'); 

module.exports = io => { 
    io.on('connection', (socket) => { 
     data.users[socket.id] = socket; 
     socket.on('Search', Search(data.users, data.waitingQueue)); 
    }); 
} 

それ自身のモジュールのように、​​は、次いで、様々な他のモジュール間で共有することができます。

+0

完璧な答えのおかげですべてが順調と良いのですが、どのように助けがない – shivshankar

2

私はREDISを使用して共有値を格納します。次に、これらの値は、/同じローカルマシン内の任意のプロセスの任意のコードから設定を取得することができる

あなたが値を設定/取得する redis clientを使用することができ

、これらの値は、Redisのデータベースに格納される (AS db)またはリモートマシンのセット(これは後でスケーリングについて言及します)。

Redisはbenchmarkedとなる可能性があり、私の経験では、他のdbソリューションと比べて驚くほど高速です。

それは使用することは非常に簡単です:An introduction to Redis data types and abstractions

  • バイナリセーフな文字列。
  • リスト:挿入順にソートされた文字列要素のコレクション 。
  • セット:一意の未ソート文字列要素の集合。
  • (ソートされたセット、セットに似ています)
  • ハッシュは、値に関連付けられたフィールドで構成されるマップです。フィールドと値の両方が文字列です。これは、
    RubyまたはPythonハッシュに非常によく似ています。

...といくつかのより多くの...

私はあなたが、私はそれがために有用な知識になると確信しているデータベース・サーバーとクライアントをインストールし、取得し、いくつかの値を設定しようと提案します未来。

エクストラ理由:

それはあなたの武器に目的をスケーリングするための本当に良い

  • その(両方:縦& 水平スケーリング)youevenより多くの電力を与える
  • socket.ioを-redisGitHub

socket.io-redisアダプタでsocket.ioを実行すると、 複数のsocket.ioインスタンスが、異なるプロセスまたはサーバで実行され、 はすべて相互にイベントをブロードキャストし、互いに送信できます。

  • socket.io - エミッタGitHub

あなたはnon-socket.io プロセス

からインスタンスをsocket.ioするイベントを発行する必要がある場合

EDIT私はあなたのコード、buの間で変数を共有したいと思います私はあなたがsocket.io使用している、あなたはそれらの変数を共有したい場合がありましたので、tはまた、あなたの奴隷をaccross ...

Socket.IO : passing events between nodes

+0

を@jamesモジュール間でデータを共有できますか? :/これらの両方のミドルウェアはsocket.ioのスケーリングに関連しています(これは問題ではありません)。 – James

+0

通常、実際のアプリケーションでは、コードのインスタンスが多分存在するため、インスタンス間で値を共有する必要があります。私があなたに示しているのは、このケースのための良いdbソリューションです(このユースケースの場合)[mysqlのような] – EMX

+0

は問題ありませんが、それは問題ではありません。しかし、実際には大量のデータを保管すると、時間の経過とともにRedisが高価になります。レディスは、過渡データ、または最高のデータ非クリティカルデータに最適です。キャッシング。これを完全なバックエンドストアとして使用することはお勧めできません(MySQLとRedisの比較はリンゴとオレンジの比較のようなものです)。 – James

関連する問題