如何在Express中间件中接收ZMQ消息?

时间:2014-09-14 04:13:36

标签: node.js express zeromq

我想在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)?
});

1 个答案:

答案 0 :(得分:6)

问题是,如错误所示,您无法从res套接字上的message事件处理程序访问req对象。您需要的是一种将该事件处理程序中的消息链接到res对象的方法。如果没有来自该套接字另一端的支持,您将无法(轻松地)做到这一点。

基本思路是将唯一ID与您通过zmq发送的每条消息相关联,并将其包含在通过req套接字发送的消息中以及从{{1}返回的回复中} socket。然后还将rep对象与相同的消息ID相关联。

我通常使用node-uuid来生成唯一ID。您还需要一种方法来轻松编码/解码您的消息(看起来您此刻只是发送直接字符串)。内置的res解析器可以正常工作,或者您可以使用更紧凑的内容,如bencodeprotobuf请务必选择套接字两端都可以使用的内容。

您的代码看起来像这样:

注意:我假设我们正在使用JSONnode-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));
});