我想在app.get中发送ZMQ消息,但在运行时我抛出错误:
events.js:72
throw er; // Unhandled 'error' event
^
ReferenceError: res is not defined
我正在运行的代码:
var zmq = require('zmq'),
zreq = zmq.socket('req'),
app = express();
zreq.connect('tcp://localhost:5559');
zreq.on('message', function (msg) {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.send(msg);
});
app.get('/words', function (req, res) {
zreq.send('nodejs');
//I think it should have something like zreqCallback(req)?
});
答案 0 :(得分:6)
问题是,如错误所示,您无法从res
套接字上的message
事件处理程序访问req
对象。您需要的是一种将该事件处理程序中的消息链接到res
对象的方法。如果没有来自该套接字另一端的支持,您将无法(轻松地)做到这一点。
基本思路是将唯一ID与您通过zmq
发送的每条消息相关联,并将其包含在通过req
套接字发送的消息中以及从{{1}返回的回复中} socket。然后还将rep
对象与相同的消息ID相关联。
我通常使用node-uuid来生成唯一ID。您还需要一种方法来轻松编码/解码您的消息(看起来您此刻只是发送直接字符串)。内置的res
解析器可以正常工作,或者您可以使用更紧凑的内容,如bencode或protobuf。 请务必选择套接字两端都可以使用的内容。
您的代码看起来像这样:
注意:我假设我们正在使用JSON
和node-uuid
。另外,我没有在这里进行任何错误处理或健全性检查; 不要忘记那些东西。
JSON
另一端(我只是假设它也是为了这个例子而在节点中编写的):
var zmq = require('zmq'),
uuid = require('node-uuid'),
zreq = zmq.socket('req'),
app = express();
var responses = {};
zreq.connect('tcp://localhost:5559');
zreq.on('message', function (data) {
data = JSON.parse(data);
var msgId = data.id;
var res = responses[msgId];
res.writeHead(200, { 'Content-Type': 'application/json' });
res.send(data.message);
responses[msgId] = null;
});
app.get('/words', function (req, res) {
var msgId = uuid.v4();
var data = { id: msgId, message: 'nodejs' };
responses[msgId] = res;
zreq.send(JSON.stringify(data));
});