Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么服务器在第二次请求时崩溃?_Node.js_Express - Fatal编程技术网

Node.js 为什么服务器在第二次请求时崩溃?

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

我有一个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)
错误:发送头后无法设置头。
在服务器响应。(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')