2016-05-17 77 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