如何从猫鼬查找之外返回列表值

时间:2018-12-06 15:45:27

标签: node.js mongodb mongoose

我使用MongoDB数据库执行任务,并尝试使用task_rating:“ OK”查找所有任务,并将结果归入一个列表,并将所有任务评级为“ NOK”的任务归入第二个列表,最后将其呈现为我的HTML作为两个信息列表。

问题是,当我想将查找结果作为列表返回到外部值时,它总是返回一个怪异的猫鼬对象。

我的代码:

app.get("/", function(req, res) {
    var nok_l = tasks.find({ task_rating: "NOK" }, (err, nokTasks) => {
        if (err)
            console.log(err);
        else {
            return nokTasks;
        }
    });
    var ok_l = tasks.find({ task_rating: "OK" }, (err, okTasks) => {
        if (err)
            console.log(err);
        else {
            return okTasks;
        }
    });

    console.log(ok_l);
    res.render("tasks", {
         ok_l: ok_l,
         nok_l: nok_l
     });
});

console.log打印的结果是猫鼬的混杂对象,而不是我的列表。

谢谢。

1 个答案:

答案 0 :(得分:0)

问题是您正在打印猫鼬的诺言对象,而不是返回的数据,因为Mongoose#find是异步的。

有许多方法可以处理这种情况,但是最基本的“教学法”是在解决诺言后仅返回数据:

app.get("/", function(req, res) {
    tasks.find({task_rating: "NOK"}, (err, nokTasks) => {

        if (!err) {
            tasks.find({task_rating: "OK"}, (err, okTasks) => {
                if (!err) {
                    res.render("tasks", {
                        ok_l: okTasks,
                        nok_l: nokTasks
                    });
                }
            });
        }

    });
});

但是,如果我们存储promises引用并使用Promise#all解决所有问题,则可以更好地构建此堆栈:

app.get("/", function(req, res) {
    let promises = [];

    promises.push(tasks.find({task_rating: "NOK"}).exec());
    promises.push(tasks.find({task_rating: "OK"}).exec());

    Promise.all(promises).then( (allTasks) => {
        // here it's necessary to handle the "OK" and "NOK" lists
        res.render("tasks", {
            list: allTasks
        });
    });    
});