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

时间:2011-08-02 10:07:30

标签: 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;
  });
  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)

为什么你认为这是?

编辑:这些请求适用于第一个请求。服务器在第二个请求时崩溃。

2 个答案:

答案 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() 
在app.get()回调函数中。

答案 1 :(得分:2)

我认为这段代码不能给我们一个完整的图片(功能不完整?)。该错误告诉我们您正在写入套接字两次。可能res.end()被调用两次而不是一次。您应该在其间放置一些调试语句(console.log)以获得更好的图片。