未处理的承诺,Mongo for循环

时间:2018-02-02 02:26:07

标签: javascript node.js mongodb express mongoose

我正在尝试在mongo查询上运行for循环,以便不断从数据库中检索数据。在检索之后,我尝试将其推送到数组然后res.send(array)以避免未处理的承诺拒绝。但相反,数据不会被推入阵列。

router.get('/results/:week',function(req,res,next){
var week = req.params.week - 1;
var results = [];
for(week; week>0; week--){
    Fixture.find({'week':week}).then(function(fixture){
        results.push(fixture);
    });
}
res.send(results);

Fixture模型包含一个变量周,我想从某一周向下检索所有结果(灯具)。给出的结果是空数组[],如果我res.send(fixture),我得到未处理的承诺拒绝警告。请帮忙,谢谢。

3 个答案:

答案 0 :(得分:0)

你的res.send需要在回调中。

此外,在找到this article后,我想也许这可能是你需要的(注意,“让周......”):

router.get('/results/:week',function(req,res,next){
var results = [];
for(let week = req.params.week -1; week>0; week--){
    Fixture.find({'week':week}).then(function(fixture){
        results.push(fixture);
        if (week == 1) {
            res.send(results);
        }
   });
}

答案 1 :(得分:0)

这与Javascript中的顺序或执行有关。我建议你看看这本书系列,有很多有用的见解!

您可以在代码中进行解决方法,如下所示:

router.get('/results/:week',function(req,res,next){
var week = req.params.week - 1;
var results = [];
for(week; week>0; week--){
    Fixture.find({'week':week}).then(function(fixture){
        results.push(fixture);
    });
}

if(week == 0)
   res.send(results);
else
   res.send([]);

答案 2 :(得分:0)

由于对mongodb的请求的异步性,你得到了空数组。

首先,我认为您需要检查周参数是否为数字

router.get('/results/:week',function(req,res,next){
    if(!parseInt(req.params.week))
        res.send("Week param not a number");
    ...

您可以使用mongoose内置函数来搜索多个结果,而不是在循环内使用异步函数

router.get('/results/:week',function(req,res,next){
    if(!parseInt(req.params.week))
        res.send("Week param not a number");

    let week = parseInt(req.params.week);

    // Fixture.find(week: {$lt: week}).

    // or

    //Fixture.find().where('week').lt(week).

    // or

    Fixture.find().lt('week', week).then(function(fixtures){
        res.send(fixtures);
    });
}

或者使用循环,如果您喜欢这种方式

router.get('/results/:week',function(req,res,next){

    if(!parseInt(req.params.week))
        res.send("Week param not a number");

    let week = parseInt(req.params.week)-1;
    let weeks = [];
    for(week; week > 0; week--){
        weeks.push(week);
    }

    Fixture.find().in('week', weeks)
        .then(function(fixtures){
            res.send(fixtures);
        });
}

P.S。在列出的所有描述的情况下,您将减少请求数量。