我的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与我的应用程序集成,以便我为应用程序的各种功能异步发送和接收消息?
答案 0 :(得分:1)
您有两台服务器。
app.get('/data', function(req, res) {
给出了这种印象)......它们都在同一个Node.js应用程序中运行。
当浏览器发出HTTP请求时,它希望获得HTTP响应。
当您从浏览器收到请求时,您没有发送HTTP响应,而是在通过ZeroMQ收到消息时发送请求。
因此,您尝试多次响应相同的HTTP请求......这是不可能的。
您需要重新考虑应用程序的体系结构。
可能你应该使用像Socket.IO这样的东西,以便你可以在服务器准备好的时候将消息从服务器推送到浏览器(而不是每当HTTP请求要求时)。