等待 MongoDB findOne 回调完成,然后再完成 app.get()

Waiting for MongoDB findOne callback to complete before finishing app.get()

本文关键字:app get MongoDB findOne 回调 等待 然后      更新时间:2023-09-26

我对Javascript比较陌生,我很难理解如何将MongoDB回调与ExpressJS get一起使用。 我的问题似乎是,如果数据库搜索花费的时间太长,该过程就会从 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);
        }
    });     
});

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

您应该测量数据库查询所需的时间。

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

返回作业状态/结果可用的 URL 的重定向。

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