更新mongodb并渲染它

时间:2015-08-03 04:55:22

标签: node.js mongodb mongoose

我正在学习mongodbnode.jsmongoose并希望更新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
},
]

我怀疑我的回调功能不正常。有谁能解释为什么?任何帮助都非常感谢。

1 个答案:

答案 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()操作在您查询整个集合以查看新添加之前进行响应。