2011-08-02 149 views
3

我有一個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',{}); 
}); 

編輯:當它在resposne像這樣執行事件失敗失敗的意義,服務器崩潰,出現以下錯誤:

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

增加了一個編輯:第一個請求起作用。第二個請求使上述錯誤崩潰了服務器。 – rsman

+0

我不太明白你想要在這裏實現什麼。爲什麼你發出一個事件並同時聽取它? adManager究竟是什麼?你爲什麼要使用事件而不是回調? – pkyeck

+0

你能幫我更好地理解我的類似問題:http://stackoverflow.com/questions/20795401/can-someone-explain-this-eventemitter-causes-failure-when-global-variable?謝謝。 – Setheron

回答

2

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正在解析從以前的事件發射的資源 - 以前的請求已經結束()'編輯 - 當事件發送給第二個請求時。奇怪。

通過添加解決它:

adManager = new AdManager() 

的app.get()回調函數內。

+0

您能接受您自己的答案,以便可以關閉此主題。 – Alfred

+0

需要等待14個小時。 – rsman

+0

好的,然後儘可能地做到這一點,我猜:) – Alfred

2

我不認爲這個代碼可以給我們一個完整的圖片(功能不完整?)。該錯誤告訴我們您正在向該套接字寫入兩次。可能res.end()被稱爲兩次而不是一次。您應該在中間放置一些調試語句(console.log)以獲得更好的圖像。

+0

adManager是繼承EventEmitter的Object()。我用它作爲全局變量來發出事件來管理代碼的流動。 – rsman

+0

如果可能,你應該提取給我們提供錯誤的代碼。將代碼複製到新目錄。例如,如果出現錯誤,則將其存檔(zip)並將其上傳到保管箱。這樣我認爲我們更容易調試。當我看着這幾條線時,我會說它必須工作! – Alfred

相關問題