我正在学习mongodb
,node.js
和mongoose
并希望更新mongodb
,然后在我的浏览器上显示它。但是,我的代码仅在我更新之前显示结果,即使我知道数据库已经更新。
所以例如我有两个叫John和Tom的学生,但是当我和第三个叫Fred的学生一起更新它并尝试渲染结果时,它只给了John和Tom的详细信息。这是我的代码:
create: function(req, res) {
console.log('creating model');
var newStud = new Models.Student({
surname: req.body.surname,
firstname: req.body.firstname,
}
);
console.log('saving model');
newStud.save();
console.log('rendering model');
Models.Student.find({},
function(err,result){
console.log('finding results');
if (err) {
throw err;}
else {
console.log('returning results');
res.send(result);
}
}
);
},
当我使用Fred的详细信息更新它时,控制台会输出以下内容:
creating model
saving model
rendering model
finding results
returning results
POST /students 200 21.629 ms - 5195
但该页面仅显示以下内容:
[
{
"surname": "Smith",
"firstname":"John"
"_id": "55bed36461521187445e5b53",
"__v": 0
},
{
"surname": "Peters",
"firstname":"Tom",
"_id": "55bed3f6c4faaa63464fc6df",
"__v": 0
},
]
我怀疑我的回调功能不正常。有谁能解释为什么?任何帮助都非常感谢。
答案 0 :(得分:1)
这里的问题当然是.save()
本身就是一种异步方法。因此需要在从集合中请求数据之前等待它做出响应。否则,它可能还没有实际创建新项目:
create: function(req, res) {
console.log('creating model');
var newStud = new Models.Student({
surname: req.body.surname,
firstname: req.body.firstname,
}
);
console.log('saving model');
newStud.save(function(err,doc) { // <-- callback here
console.log('rendering model');
Models.Student.find({},
function(err,result){
if (err) {
throw err;}
else {
console.log('returning results');
res.send(result);
}
}
);
});
});
所以基本上你需要等待&#34;其他.save()
操作在您查询整个集合以查看新添加之前进行响应。