我正在尝试创建一个发送套接字获取的信息的API
要从我的套接字获取信息,我使用zmq。
这个想法是从套接字获取信息时,将此信息作为我的API中的响应发送。以下代码假装这样做。
[...]
enclaveSocket.on('message', function (message) {
res_json.info = message.toString('base64');
res.json(res_json);
});
enclaveSocket.send('chesf:public');
[...]
在我的快速API的第一个请求中,返回是预期的:
{
"organization": "my_org",
"info": "AjCWyQeBNeuMnA3nAUrbprxctrdOgZmjDR5Rmuw6LzzMpALspfNapLMoRGPx9YEGFrqrE5vdHKPb/z0S23i8v"
}
但在第二个请求中,我的API崩溃并出现以下错误:
events.js:160
throw er; // Unhandled 'error' event
^
Error: Can't set headers after they are sent.
at ServerResponse.setHeader (_http_outgoing.js:367:11)
at ServerResponse.header (/home/matteus/keyvault-node/node_modules/express/lib/response.js:725:10)
at ServerResponse.send (/home/matteus/keyvault-node/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/home/matteus/keyvault-node/node_modules/express/lib/response.js:256:15)
at exports.Socket.<anonymous> (/home/matteus/keyvault-node/routes/keys.js:58:21)
at emitOne (events.js:101:20)
at exports.Socket.emit (events.js:188:7)
at exports.Socket.Socket._flushRead (/home/matteus/keyvault-node/node_modules/zmq/lib/index.js:636:10)
at exports.Socket.Socket._flushReads (/home/matteus/keyvault-node/node_modules/zmq/lib/index.js:676:23)
at Object._zmq.onReadReady (/home/matteus/keyvault-node/node_modules/zmq/lib/index.js:297:10)
那就是它。
答案 0 :(得分:1)
我使用enclaveSocket.once()
代替enclaveSocket.on()
解决了我的问题
当事件由同一个函数处理时, once()
方法会删除事件侦听器。
有关此处的更多信息:http://nodeguide.com/beginner.html#using-eventemitters