3

Socket.IOを使用して、クライアントのWebページにNode.JSサーバーから動的にデータをフェッチさせています。サーバー側では、zeromqソケットライブラリ(REQ / REP構造、zguideのrrclient.jsの例を参照)を使用して、リクエストをPythonバックエンドに転送しています。

ただし、私のサーバーはsocket.ioサーバーとして機能しているため、特定のクライアントに返送するには、応答を次のようにラップする必要があります。

socket.on('app_request',function(appRequest){
      //route this request to the backend.
      var results = fetch_data(appRequest);
      //return it to the client
      socket.emit('app_results',results);
  });

そのため、fetch_data関数はzmqソケット(socket.send)を使用してサーバーにリクエストをプッシュします。

ただし、Node ZMQソケットは、socket.on('message'、function(){});を使用して要求に応答します。リスナーであり、実際には何も返しません。

socket.on('message'、function(){});を使用するにはどうすればよいですか。socket.send()リクエストを開始した特定の関数に値を返すには?

つまり、クライアントのsocket.ioリクエストを取得して、Node.JSがZMQを使用してPythonバックエンドから関連データをフェッチし、それをsocket.ioクライアントに返すようにするにはどうすればよいですか?(もちろん、ノンブロッキング方式で)

4

1 に答える 1

2

私は似たようなことをしました。そのように作り直してください。

socket.on('app_request',function(appRequest){
  //route this request to the backend.
  fetch_data(appRequest, function(err, results) {
       socket.emit('app_results',results);
  });
});

zmq は非ブロッキングであるため、socket.io に送信する前に応答が受信されません。このメソッドを使用すると、fetch_data メソッドを調整して、応答が返されるまでコールバックを保存してから起動できます。

インスピレーションのためのラフな fetch_data はテストされていません。

var zmq = require('zmq'),
    req = zmq.socket('req'),
    count = 0,
    jobs = {};


req.on('message', function(response) {
    var args  = JSON.parse(response),
        reply = args[0],
        id    = args[i];

    if (id && jobs[id]) {
         jobs[id].apply(null, Array.isArray(reply) ? reply : [reply]);

         delete jobs[id];
    }
}

function fetch_data(appRequest, callback) {
    var data = JSON.stringify([appRequest, count]);

    jobs[count] = callback;

    req.send(data);

    ++count;
}

次に、反対側でjsonを解析し、IDを保持して、応答とともに送り返します。

于 2012-09-24T14:06:35.257 に答える