同步 nodeJS 命令

Sync nodeJS commands

我使用此功能将测试保存在 mongo 数据库中 mongoose:

 Company.findOne({_id : companyId}).exec( function(err, company) {
        if (err) {
            console.log("Error:", err);
        }

        var test = new Test.Test({
            name:               body.testTitle,
            numberQuestion:     body.numberProblems,
            timer:              body.testTimer,
            treshold:           body.testTreshold,
            problems:           [],
            company:            company

        })

        for(var i = 0; i < body.testProblems.length; i++){
            Test.Question.findOne({_id : body.testProblems[i]}).exec( function(err, problem) {
                if (err) {
                    console.log("Error:", err);
                }
                test.problems.push(problem);
            });
        }

        test.save(function(err) {
            if(err){
                res.status(500).send("{ \"redirect\" : \"/test\" }");
            }  
            else{
                console.log(test);  
                res.status(200).send("{ \"redirect\" : \"/test\" }");       
            } 
        });
  });

问题是在 for 循环结束之前调用了 test.save(..)。结果是保存在数据库中的测试,字段问题为空。 如何在执行命令 .save 之前将问题推送到测试?

exec 应该 return 一个 Promise 可以用来等待它完成:

var addingTestProblems = [];
for(var i = 0; i < body.testProblems.length; i++){
    addingTestProblems.push(Test.Question
        .findOne({_id : body.testProblems[i]})
        .exec(function(err, problem) {
            if (err) {
                console.log("Error:", err);
            }
            test.problems.push(problem);
        }));
}

Promise.all(addingTestProblems)
    .then(() => {
        console.log(test);  
        res.status(200).send("{ \"redirect\" : \"/test\" }");
    })
    .catch(() => res.status(500).send("{ \"redirect\" : \"/test\" }"));