2016-05-17 56 views
3

我的findSomething函數有一個錯誤。MongoDB:當在mongoDb中查詢時發生錯誤

function findSomething(req, res, next) { 
    Myschema.findXXXById(req.params.xid, function (err, doc) { 
    if (err) res.json({ status: 1, message: messages.NotFound }); 
    res.json({ status: 0, docsInfo: doc }); 
    }); 
} 

我得到的錯誤是這樣的

Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)

我明白,錯誤是因爲我如果條件定義很差,來理解錯誤大家從我想找一個可能性其中查詢可能會遇到錯誤。

E.g.

if(err) { 
    // how to get here 
} 

我試圖從數據庫中刪除數據,因此現在當它沒有得到它仍然無法給出了一個錯誤的數據,而是返回空來代替。

所以我想知道一個人如何能在MongoDB中

+0

你可以嘗試使用一個無效的id(一個不是一個有效的'ObjectId',比如說''abc''而不是'req.params.xid'),但我不是當然,如果那些不會發生混亂dy被貓鼬抓住了。但是,如果你願意,我也可以向你解釋爲什麼你得到了這個錯誤信息; D – robertklep

+0

是肯定的請。 –

+0

我猜的是,發生了錯誤,控制進入下一行,它再次發送響應,所以錯誤:發送後無法設置標題。這就是爲什麼我只是想檢查我如何得到這個錯誤。 –

回答

2

你猜對了(在您的評論)遇到一個錯誤:當錯誤發生時,您發回的錯誤響應,但你不停止的休息來自運行的代碼。

您應該確保始終只調用一個將發送標題並結束響應的操作;像這樣的操作是res.json(),res.send(),res.render(),和其他一些。

您可以重組這樣的代碼:

if (err) { 
    res.json({ status: 1, message: messages.NotFound }); 
} else { 
    res.json({ status: 0, docsInfo: doc }); 
} 

甚至是這樣的:

if (err) { 
    return res.json({ status: 1, message: messages.NotFound }); 
} 
res.json({ status: 0, docsInfo: doc }); 

(在return說法有沒有打算返回一個值,但停止休息的代碼從運行)

+0

感謝羅伯特,這將做我猜。我只是想重現這個錯誤,但沒有發生。無論如何,我會以此結束它。 –

+0

@sacDahal通常值得記錄發生的錯誤:) – robertklep