3

我正在使用 Socket.IO 让客户端网页从我的 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 回答