从zmq套接字返回值

我正在使用Socket.IO有一个客户端网页从我的Node.JS服务器dynamic获取数据。 在服务器端,我使用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客户端? (当然是以非阻塞的方式)

我做了类似的事情,你会想这样做,

 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方法来存储callback,直到返回响应,然后再触发它。

粗糙的fetch_data灵感只有未经testing;

 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; } 

然后在另一边parsingjson并保存id并将其发送回响应。