为什么mongoose代码中的回调将文档视为null?

时间:2016-11-19 03:46:05

标签: node.js mongodb mongoose

我有以下代码:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test')
var Schema = mongoose.Schema;
var schema = new Schema({name : String, inventory: {}});
var Character = mongoose.model('Character',schema);
var Frodo = new Character({name: 'Frodo',inventory:{ringOfPower: 1}});
Frodo.save();
Character.findOne({name : 'Frodo'},function(error, character){
    console.log(character);
});

我正在运行它作为节点optionminimize.js并且null被记录到控制台。它在mongodb中保持不变,我打开了一个mongodb shell并运行

db.characters.findOne({name:'Frodo'})

并获得以下结果:

{
        "_id" : ObjectId("582fc3bab386f00ed0e7fede"),
        "name" : "Frodo",
        "inventory" : {
                "ringOfPower" : 1
        },
        "__v" : 0
}

为什么回调中的document参数接收null?

1 个答案:

答案 0 :(得分:1)

Frodo.save()是一个异步调用,因此它会返回 Promise ,并在Charachter.findOne承诺解决之前立即按Frodo.save()搜索该行。

因此,必须在成功保存字符后执行搜索,否则如前所述返回null,因此您的代码必须如下所示:

Frodo.save()
  .then(function() {
    Character.findOne({name : 'Frodo'}, function(error, character) {
        console.log(character);
    });
  })