API的执行顺序已在节点js

时间:2019-05-03 19:33:04

标签: node.js mongodb api

我正在使用MongoDB在Node上创建一个API,我学习缓慢。创建GET路由时,我遇到了问题,在通过实现的逻辑之前先发送了请求响应。在代码中,总是先执行res.send(listClass);行,紧接着执行foreach。

exports.getClassrooms = (req, res) => {
    const listClass = [];
    const query = {"userId": req.params.id};
    classUser.find(query, (err, result) => {
        if(result){
            result.forEach(data => {
                classroom.findById({"_id": data.classId}, (err, doc) => {
                    if(doc){
                        listClass.push(doc);
                    }
                });
            });
        }
        res.send(listClass); 
    }).catch( err => {
        res.status(500).send({
           message: err.message || "Erro to find the class."
        });
    });
}

1 个答案:

答案 0 :(得分:0)

var async = require('async');
exports.getClassrooms = (req, res) => {
    const listClass = [];
    const query = { "userId": req.params.id };
    classUser.find(query, (err, result) => {
        if (result) {
            var i = 0;
            async.whilst(function () {
                return i <= result.length
            },
                function (next) {
                    classroom.findById({ "_id": data.classId }, (err, doc) => {
                        if (doc) {
                            listClass.push(doc);
                        }
                    });
                    i = i + 1;
                    next();
                },
                function (err) {
                    res.send(listClass);
                }
            )
        }

    }).catch(err => {
        res.status(500).send({
            message: err.message || "Erro to find the class."
        });
    });
}

classroom.findById功能不是同步功能,此功能为asynchronous功能。
因此,我们可以使用async库,
有针对此问题的服务器方法,我使用了whilst函数

此外,我们可以使用await / async代替async库。