我有一个nodejs服务器,如下所示。当res.header()语句不在事件内时,服务器能够设置标头。它在重新定位到这样的事件时执行失败:
app.get('/m/ad', function (req, res) {
adManager.on('ad_unit_exists', function (ad_unit) {
res.header('Ad-Type',"html");
res.end();
return;
});
adManager.emit('ad_unit_exists',{});
});
编辑:失败意味着,服务器崩溃并出现以下错误:
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:526:11)
at ServerResponse.setHeader (/home/raj/node_modules/express/node_modules/connect/lib/patch.js:44:20)
at ServerResponse.header (/home/raj/node_modules/express/lib/response.js:242:10)
at EventEmitter.<anonymous> (/home/raj/Projects/adreactor-node/server.js:227:28)
at EventEmitter.emit (events.js:81:20)
at Object.<anonymous> (/home/raj/Projects/adreactor-node/server.js:232:16)
at nextMiddleware (/home/raj/node_modules/express/lib/router/index.js:139:34)
at param (/home/raj/node_modules/express/lib/router/index.js:147:16)
at pass (/home/raj/node_modules/express/lib/router/index.js:155:10)
at Object.router [as handle] (/home/raj/node_modules/express/lib/router/index.js:161:6)
为什么你认为这是?
编辑:这些请求适用于第一个请求。服务器在第二个请求时崩溃。
答案 0 :(得分:3)
adManager变量是一个全局变量。由于某种原因,它将参数存储到事件处理程序。
我使用adManager作为一种全局EventEmitter对象,用于发出事件和管理代码流。
我在外面有一个额外的声明,以便在服务器启动时初始化adManager:
app.get('/m/ad', function (req, res) {
adManager.on('ad_unit_exists', function (ad_unit, req, res) {
res.header('Ad-Type',"html");
res.end();
return;
});
adManager.emit('ad_unit_exists',{}, req, res);
});
AdManager.prootype = new process.EventEmitter();
var adManager = new AdManager();
ad_unit_exists事件回调中的res
正在解析前一个事件发射的res - 前一个请求已经结束()' - 当为第二个请求发出事件时。奇怪。
通过添加:
来解决它adManager = new AdManager()
答案 1 :(得分:2)
我认为这段代码不能给我们一个完整的图片(功能不完整?)。该错误告诉我们您正在写入套接字两次。可能res.end()
被调用两次而不是一次。您应该在其间放置一些调试语句(console.log
)以获得更好的图片。