javascript – 猫鼬 – 链接承诺

我正在寻找有关如何使用
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;
  });
};

我从我的(node / express)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
    });
  });

问题是:

>即使user在findOne查询中为null,也永远不会调用create
>我不确定我是否使用了正确的承诺风格/最有效的编码风格
>我是否正确处理错误,例如只是在顶层或我是否需要在每个级别进行

任何人都可以看到我做错了什么,以及我怎么能做得更好?

谢谢.

UPDATE

问题的原因是

self.model.create(...)

应该是(没有型号参考)

self.create(...)

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

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

return res.sendStatus(500).send({ error: err });

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

最佳答案 问题可能是:

> create方法返回一个promise,它没有方法exec
>如果你想在自定义方法中使用then(),你必须返回一个promise,但是你要返回一个mongoose文件:return user;

这将始终返回一个promise,它允许你在你的方法之后使用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;
};

希望这对你有所帮助

点赞