2013-05-13 43 views
0

我正在使用restify模塊啓動節點js Web服務器。nodejs restify錯誤 - 處理爲靜態函數的回調服務請求

server = restify.createServer(); 
server.post('/getData', DataManager.getData); 

處理器爲/getData路徑是這樣的: -

DataManager.prototype.getData = function(request, response, next) { 
    var body = JSON.parse(request.body); 
    var key = body.key; 

    callback = function(err, instance) { 
     if(!err && instance) { 
      response.send(instance); 
     } 
     else { 
      response.send('err'); 
     } 
     return next(); 
    } 

    MongooseModel.findOne(key, callback); 
} 

當我拍不同的有效載荷2個併發請求/getData,服務器拋出[Error: Can't set headers after they are sent.]錯誤,並且不會給第二請求作出響應。

我正在尋找補救辦法。

-

我認爲,對待的RESTify作爲DataManager.getData一個靜態函數。它使用一個新的對象DataManager來向/getData提供每個請求,而不是使用它的單個靜態實例。雖然第一個請求仍然按nodejs執行,但第二個請求嘗試發送響應,這就是爲什麼nodejs說can't set headers after they are sent。我得出這個結論,因爲我試着拍攝兩個連續的請求,而不是平行的請求,我的代碼在這種情況下工作得很好。

回答

2

您的回調有上下文問題!

應指定響應&未來的會議......你試圖用var宣佈,它可能會解決你的問題,我想......

var callback=..... 

在其他情況下,你需要通過這兩個響應()& next()它...

+0

聲明與VAR幫助回調。你能否詳細說明爲什麼這會起作用?有和沒有var的回調有什麼區別?我是一個JavaScript初學者。 – haltTm 2013-05-14 10:31:19

+0

沒有var你的功能是「全球化」,老實說,我不知道什麼是「關閉」(我認爲所有的調用回調採取最後的功能,但不知道) – 2013-05-14 11:02:18

+0

隨着var你創建一個本地實例或你的函數爲每getdata調用,你肯定會關閉它.....希望它更清晰,像這樣:) – 2013-05-14 11:04:56