Model.find()在Mongoose + Nodejs中的model.save()之后返回null

时间:2018-03-23 16:29:24

标签: javascript node.js mongodb mongoose mongoose-schema

保存功能完美地工作,但是在它下面的查找功能在搜索先前保存的保存对象时返回null。 这是代码:

var mongoose = require("mongoose");
var User = mongoose.model("User");

module.exports.register = function(req, res) {
  var user = new User();
  user.name = req.body.name;
  user.email = req.body.email;
  user.setPassword(req.body.password);
  user.save(function(err) {
    var token;
    token = user.generateJwt();
    res.status(200);
    res.json({
      token: token
    });
  });
  User.findById(user._id, function(err, particularDocument) {
    if (err) {
      console.log(err);
    } else {
      console.log(particularDocument);
    }
  });
};

User.findById()返回null。即使User.find({})返回null

1 个答案:

答案 0 :(得分:2)

从代码中保存和查找数据都是异步的。

由于查找结果取决于保存完成,因此您必须等待save完成才能调用find(或findById)。

目前,您正在同时执行它们:

// call save but don't wait for it to finish
user.save(/* callback when save is done. this is executed sometime after all other code is done executing. */);
// call findById but don't wait for it to finish
User.findById(user._id, /* callback when find is done. this is executed sometime after all other code is done executing. */);
// continue here before any of the callbacks are executed

但你应该连续执行它们:

user.save(function() {
  User.findById(user._id, function(err, user) {
    // get user here
  })
  // ...
});

这是必要的原因是因为异步代码在所有同步代码完成后运行了一段时间

换句话说,在同步代码的当前段完成之前,不会运行任何异步代码。