'在发送标题后无法设置标题'来自zeromq的错误

时间:2017-10-04 16:00:22

标签: javascript node.js zeromq

我的nodejs应用使用 zeromq 与后端进行通信。它通常运行良好,但在应用程序运行时重新启动后端的情况下,它将崩溃报告以下消息:

events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: Can't set headers after they are sent.
    at ServerResponse.setHeader (_http_outgoing.js:371:11)
    at ServerResponse.header (/home/gl/Documents/client/node_modules/express/lib/response.js:592:10)
    at ServerResponse.send (/home/gl/Documents/client/node_modules/express/lib/response.js:144:12)
    at ServerResponse.json (/home/gl/Documents/client/node_modules/express/lib/response.js:233:15)
    at exports.Socket.<anonymous> (/home/gl/Documents/client/app/routes.js:13:12)
    at emitMany (events.js:127:13)
    at exports.Socket.emit (events.js:204:7)
    at exports.Socket.Socket._emitMessage (/home/gl/Documents/client/node_modules/zeromq/lib/index.js:640:15)
    at exports.Socket.Socket._flushRead (/home/gl/Documents/client/node_modules/zeromq/lib/index.js:651:10)
    at exports.Socket.Socket._flushReads (/home/gl/Documents/client/node_modules/zeromq/lib/index.js:687:15)

routes.js看起来像这样:

module.exports = function(app) {    
    var zmq = require('zeromq')
    , sock = zmq.socket('dealer');
    var response = null;

    sock.on('message', function(data) {
        response.json({data: data.toString()});
    });

    app.get('/data', function(req, res) {
        response = res;
        sock.send(['', 'low']);     
    });
};

这样一旦消息来自后端,它将使用当前的response对象发送。这是我发现从zeromq捕获响应并将响应发送回我的应用程序的最简单方法。

导致该错误弹出的原因是什么,如果是由于我的代码设计,是否有更好的方法将zeromq与我的应用程序集成,以便我为应用程序的各种功能异步发送和接收消息?

1 个答案:

答案 0 :(得分:1)

您有两台服务器。

  • ZeroMQ
  • Express(或其他一些HTTP服务器......至少使用app.get('/data', function(req, res) {给出了这种印象)

......它们都在同一个Node.js应用程序中运行。

当浏览器发出HTTP请求时,它希望获得HTTP响应。

当您从浏览器收到请求时,您没有发送HTTP响应,而是在通过ZeroMQ收到消息时发送请求。

因此,您尝试多次响应相同的HTTP请求......这是不可能的。

您需要重新考虑应用程序的体系结构。

可能你应该使用像Socket.IO这样的东西,以便你可以在服务器准备好的时候将消息从服​​务器推送到浏览器(而不是每当HTTP请求要求时)。