Node.js 为什么服务器在第二次请求时崩溃?
我有一个nodejs服务器,如下所示。当res.header()语句不在事件中时,服务器可以设置头。在响应以下事件时执行时失败:Node.js 为什么服务器在第二次请求时崩溃?,node.js,express,Node.js,Express,我有一个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; }); adMana
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)
错误:发送头后无法设置头。
在服务器响应。(http.js:526:11)
在ServerResponse.setHeader(/home/raj/node_modules/express/node_modules/connect/lib/patch.js:44:20)
在ServerResponse.header(/home/raj/node_modules/express/lib/response.js:242:10)
在黄昏时分。(/home/raj/Projects/adreactor node/server.js:227:28)
在EventEmitter.emit(events.js:81:20)
反对。(/home/raj/Projects/adreactor node/server.js:232:16)
在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)
通过时(/home/raj/node_modules/express/lib/router/index.js:155:10)
在Object.router[作为句柄](/home/raj/node_modules/express/lib/router/index.js:161:6)
你认为这是为什么
编辑:请求对于第一个请求非常有效。服务器在第二次请求时崩溃。我认为此代码无法提供完整的图片(功能不完整?)。错误告诉我们您正在向套接字写入两次。可能
res.end()
会被调用两次而不是一次。您应该在两者之间放置一些调试语句(console.log
),以获得更好的效果。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()
在app.get()回调函数中 添加了一个编辑:第一个请求有效。第二个请求由于上述错误导致服务器崩溃。我不太明白您在这里想要实现什么。为什么要发出一个事件并同时收听它?adManager到底是什么?你为什么要处理事件而不是回调?你能帮我更好地理解我的类似问题吗?Thank.adManager是一个继承EventEmitter的对象(),仅此而已。我使用它作为一个全局变量来发出事件来管理代码的流动。如果可能的话,您应该提取给我们错误信息的代码。将代码复制到新目录。例如,当您遇到错误时,您可以归档(zip)并将其上载到dropbox。这样,我认为我们更容易调试。当我看到这几行的时候,我会说它必须工作!您是否可以接受自己的答案,以便结束本主题。好的,然后尽可能这样做,我想:)此外,如果您只希望触发一个事件,那么只使用adManager更安全、更方便资源。一旦('ad_unit_exists')