【问题标题】:Error with zmq and expresszmq 和 express 出错
【发布时间】:2017-05-03 22:08:22
【问题描述】:

我正在尝试创建一个 API,用于发送通过套接字获取的信息。
为了从我的套接字中获取信息,我正在使用 zmq。
这个想法是当从套接字获取信息时,将此信息作为响应发送到我的 API 中。以下代码假装这样做。

[...]
enclaveSocket.on('message', function (message) {

    res_json.info = message.toString('base64');

    res.json(res_json);
});
enclaveSocket.send('chesf:public');
[...]

在我的 express 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)

就是这样。

【问题讨论】:

    标签: javascript node.js express zeromq


    【解决方案1】:

    我使用 enclaveSocket.once() 而不是 enclaveSocket.on() 解决了我的问题。
    当事件由同一函数处理时,once() 方法会移除事件侦听器。

    关于这里的更多信息:http://nodeguide.com/beginner.html#using-eventemitters

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      相关资源
      最近更新 更多