在完成app.get()之前等待MongoDB findOne回调完成

时间:2015-03-10 19:46:55

标签: javascript mongodb asynchronous express callback

我对Javascript比较陌生,我无法理解如何使用ExpressJS get来使用MongoDB回调。我的问题似乎是,如果数据库搜索花费的时间太长,则该过程不属于app.get(),并且会给网页一个错误代码:ERR_EMPTY_RESPONSE"。

目前它适用于大多数值,无论是查找值还是正确返回404 - 未找到,但在某些情况下,它会在转动ERR_EMPTY_RESPONSE之前挂起几秒钟。在调试器中,它到达app.get()的末尾,返回ERR_EMPTY_RESPONSE,之后findOne回调结束并转到404,但到那时为时已晚。

我尝试使用异步并引入等待但没有成功,这让我觉得我正在使用app.get和findOne错误。

以下是我的代码的一般版本:

app.get('/test', function (req, res) {
    var value = null;
    if (req.query.param)
        value = req.query.param;
    else
        value = defaultValue;

    var query = {start: {$lte: value}, end: {$gte: value}};
    var data = collection.findOne(query, function (err, data) {
        if (err){
            res.sendStatus(500);
        }
        else if (data) {
            res.end(data);
        }
        else{
            res.sendStatus(404);
        }
    });     
});

如何让响应等待数据库搜索完成?或者是否有更好的方法从请求中返回数据库文档?谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您应该测量db查询所需的时间。

如果它慢了> 5秒并且你无法加快速度,那么通过使用某种工作框架将它与请求分离可能是一个好主意。

返回重定向工作状态/结果可用的网址。

答案 1 :(得分:0)

我对此感到愚蠢,但我完全忽略了这样一个事实:当使用http.createServer()时,我的超时设置为3000毫秒。我误解了这个超时是什么,这是导致我的连接过早关闭的原因。增加这个数字可以让我最顽固的查询完成。