我正在使用Socket.IO让客户端网页从我的Node.JS服务器动态获取数据。在服务器端,我使用zeromq套接字库将请求转发到Python后端(REQ / REP结构,请参阅zguide中的rrclient.js示例)。
但是,由于我的服务器充当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客户端? (当然是以非阻塞的方式)
答案 0 :(得分: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并将其发送回响应。