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

o0o*_*o0o 2 zeromq node.js express

我想在app.get中发送ZMQ消息但是在运行时我抛出错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
ReferenceError: res is not defined
Run Code Online (Sandbox Code Playgroud)

我的运行代码:

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)?
});
Run Code Online (Sandbox Code Playgroud)

Mik*_*e S 6

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

基本思想是将唯一ID与您发送的每条消息相关联,zmq并将其包含在通过req套接字发送的消息和从rep套接字返回的消息中.然后还将该res对象与相同的消息ID 相关联.

我通常使用node-uuid来生成唯一的id.您还需要一种方法来轻松编码/解码您的消息(看起来您现在只是发送直接字符串).内置的JSON解析器可以正常工作,或者你可以使用像bencodeprotobuf这样更紧凑的东西.一定要选择插座两端都可以使用的东西.

你的代码看起来像这样:

注意:我假设我们正在使用node-uuidJSON.另外,我没有在这里进行任何错误处理或健全性检查; 不要忘记那些东西.

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));
});
Run Code Online (Sandbox Code Playgroud)

在另一端(我只是假设它也是为了这个例子而在节点中编写的):

var zmq = require('zmq');
zrep = zmq.socket('rep');

zrep.bind('tcp://localhost:5559');

zrep.on('message', function(data) {
    data = JSON.parse(data);
    var msgId = data.id;
    var msg = data.message;

    // Do whatever you were doing before to process the message
    // We'll say it ends up in a "results" variable

    var response = { id: msgId, message: results };
    zrep.send(JSON.stringify(response));
});
Run Code Online (Sandbox Code Playgroud)