Mongoose没有调用save()和find()的回调

时间:2017-09-05 03:44:47

标签: node.js mongodb mongoose

我没有进入save()或find()方法的回调。它也没有进入mongoose.connect的回调。知道为什么吗?

这是我的代码:

mongoose.connect("mongodb://localhost/blah", {
    useMongoClient: true,
}, function (err) {
    console.log('connect to database'); // Not called
    if (err) {
        throw err;
    }
});

var Schema = mongoose.Schema
var User = new Schema({
    author    : String
  , type      : String
});

var MyUserModel = mongoose.model('User', User); //create and access the model User

var u = new MyUserModel();
u.author = 'authorname';
u.save(function(err){
    console.log("saved") // not called
    if (err) console.log(err);
});

MyUserModel.find({}, function (err,docs) {
    console.log("found"); // not called
    console.log(docs);
});

1 个答案:

答案 0 :(得分:2)

你需要"等待"做任何事之前的联系。这是一个" async"函数,就像所有异步函数一样,在继续依赖于结果的其他代码之前,需要等待它们的解析。在这种情况下,"连接"以后对数据库的操作将需要它。

async/await的现代环境中做得最好:

// setup part
var Schema = mongoose.Schema
var User = new Schema({
    author    : String
  , type      : String
});

var MyUserModel = mongoose.model('User', User); //create and access the model User

// async parts - wrapped in a self executing closure with the async keyword
(async function() {   

  try {

    const conn = await mongoose.connect("mongodb://localhost/blah", {
      useMongoClient: true,
    });
    console.log('database connected');

    // Add a user and wait for it to save
    var u = new MyUserModel();
    u.author = 'authorname';
    await u.save();
    console.log("saved");

    // find the documents and await that too
    let docs = await MyUserModel.find();

    console.log(JSON.stringify(docs,undefined,2));

  } catch(e) {
    console.error(e);
  } finally {
    mongoose.disconnect();
  }

})();

或者通过在旧版nodejs版本中链接promises:

// setup part
var Schema = mongoose.Schema
var User = new Schema({
    author    : String
  , type      : String
});

var MyUserModel = mongoose.model('User', User); //create and access the model User

// Async part
mongoose.connect("mongodb://localhost/blah", { useMongoClient: true })
   .then( () => {
     var u = new MyUserModel();
     u.author = 'authorname';
     return u.save();
   })
   .then( () => MyUserModel.find() )
   .then( docs => {
     console.log(JSON.stringify(docs,undefined,2));
     mongoose.disconnect();
   })
   .catch( e => console.error(e) );

底线是您需要等待所有异步调用的完成,.connect()现在是现代mongoose版本中的异步调用。它应该总是这样处理,但现在你必须"必须"像这样处理。