Mongoose - 链接承诺

pru*_*ule 5 javascript mongoose mongodb node.js promise

我正在寻找有关如何使用mongodb/mongoose.

我目前尝试过:

userSchema.statics.findByFacebookIdOrCreate = function(facebookId, name, email) {
  var self = this;
  return this.findOne({
    facebookId: facebookId
  }).exec().then(function(user) {
    if (!user) {
      return self.model.create({
        facebookId: facebookId,
        name: name,
        email: email
      }).exec().then(function(user) {
        return user;
      });
    }
    return user;
  });
};
Run Code Online (Sandbox Code Playgroud)

我从我的(节点/快递)API 端点调用它:

User.model.findByFacebookIdOrCreate(fbRes.id, fbRes.name, fbRes.email)
  .then(function(user) {
    return res.sendStatus(200).send(createTokenForUser(user));
  }, function(err) {
    return res.sendStatus(500).send({
      error: err
    });
  });
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 即使 findOne 查询中的 user 为 null,也永远不会调用 create
  2. 我不确定我使用的是正确的承诺风格/最有效的编码风格
  3. 我是否正确处理错误,例如只是在顶层还是我需要在每个级别都这样做

谁能看到我做错了什么,以及我怎样才能做得更好?

谢谢。

更新

问题的原因是

self.model.create(...)
Run Code Online (Sandbox Code Playgroud)

应该是(没有模型参考)

self.create(...)
Run Code Online (Sandbox Code Playgroud)

但是,我现在需要知道我在错误处理方面做错了什么 - 我可以看到错误正在发生,但我看不到原因。

我仍然有一些错误发生,我知道这是因为我的状态为 500

return res.sendStatus(500).send({ error: err });
Run Code Online (Sandbox Code Playgroud)

但实际的错误消息/详细信息为空。

Edu*_*uez 2

问题可能是:

  1. create方法返回一个承诺,并且它没有方法exec
  2. 如果你想在你的自定义方法中使用then() ,你必须返回一个承诺,但你返回的是一个猫鼬文档:return user;

这将始终返回一个承诺,它允许您在方法之后使用then()(您必须添加mpromise模块):

userSchema.statics.findByFacebookIdOrCreate = function (facebookId, name, email) {
  var self = this;
  var Promise = require('mpromise');
  var promise = new Promise;
  this.findOne({facebookId: facebookId }).exec()
    .then(function (user) {
        if(user) {
            promise.fulfill(user);
            return;
        }

        self.model.create({ facebookId: facebookId, name: name, email: email })
            .then(function (user) {
                promise.fulfill(user);
                return;
            });
    });
  return promise;
};
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助