同步 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\" }"));
我使用此功能将测试保存在 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\" }"));