gpt4 book ai didi

node.js - 如何在 Express 中间件中接收 ZMQ 消息?

转载 作者:搜寻专家 更新时间:2023-11-01 00:18:15 30 4
gpt4 key购买 nike

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

最佳答案

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

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

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

您的代码看起来像这样:

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

在另一端(出于本示例的目的,我假设它也是用 Node 编写的):

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

关于node.js - 如何在 Express 中间件中接收 ZMQ 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25830002/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com