2017-04-26 112 views
0

我試圖在我的代碼中查找錯誤,而其他主題沒有任何結果。發送後無法設置標題

有app.js代碼,其包含來自快車模塊get方法:

app.get('/notes', notesController.all); 

有notesController.js代碼,其中出口到app.js create方法:

exports.all = function (req, res) { 
    Notes.all(function(err, docs){ 
     if(err){ 
      console.log(err); 
      return res.sendStatus(500); 
     } 
     res.send(docs); 
    }) 
}; 

model此編碼:

​​

應用程序崩潰與這個錯誤:

process.nextTick(function() { throw err; }); 
          ^

Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11) at ServerResponse.header (O:\OGPI6\node_modules\express\lib\response.js:725:10) at ServerResponse.json (O:\OGPI6\node_modules\express\lib\response.js:253:10) at ServerResponse.send (O:\OGPI6\node_modules\express\lib\response.js:158:21) at O:\OGPI6\controllers\notes.js:9:13 at O:\OGPI6\models\notes.js:6:9 at handleCallback (O:\OGPI6\node_modules\mongodb\lib\utils.js:120:56) at O:\OGPI6\node_modules\mongodb\lib\cursor.js:860:16 at handleCallback (O:\OGPI6\node_modules\mongodb-core\lib\cursor.js:171:5) at setCursorDeadAndNotified (O:\OGPI6\node_modules\mongodb-core\lib\cursor.js:505:3)

在我的腦海裏唯一的錯誤,在回調函數「控制器」:

if(err){ 
      console.log(err); 
      return res.sendStatus(500); 
     } 
     res.send(docs); 

但我認爲,當發生錯誤,必須終止函數並返回sendStatus(500),但登錄後它嘗試返回的控制檯中的錯誤res.send(docs),然後應用程序崩潰,因爲它正在發送第二個標頭。它看起來很好,但沒有工作。任何人都可以指出我失敗的方式嗎?

+1

您是否認爲''exports.all'方法可能會多次觸發回調。你有沒有試圖在回調開始時放置一個'console.log'? –

+0

我同意@BenjiLees,它看起來像回調被召喚兩次。 – robertklep

回答

1

使用「下一個」參數中的中間件進行明確知道,這個中間件的目的是完成並沒有進一步的需要執行的代碼。

exports.all = function (req, res, next) { 
    Notes.all(function(err, docs){ 
     if(err){ 
      console.log(err); 
      res.sendStatus(500); 
      return next(); 
     } 
     res.send(docs); 
    }) 
}; 

返回後執行代碼可能是由於異步性質。

您也可以使用else塊。

exports.all = function (req, res, next) { 
     Notes.all(function(err, docs){ 
      if(err){ 
       console.log(err); 
       res.sendStatus(500); 

      } 
      else res.send(docs); 
     }) 
    }; 
+1

發送迴應_and_ calling'next'都不是一個好主意,因爲next可能會讓Express將控制權交給另一個也可能發回響應的請求處理程序(或最終的「找不到」處理程序)。 – robertklep

0

更改代碼

if(err){ 
    console.log(err); 
    return res.status(500).send(err); 
} 
res.send(docs); 
相關問題