javascript - Mongoose - 链接 promise

标签 javascript node.js mongodb mongoose promise

我正在寻找有关如何使用 mongodb/mongoose 链接“查找或创建”功能的 promise 的建议。

我目前尝试过:

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
    });
  });

问题是:

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

谁能看出我做错了什么,以及我如何才能做得更好?

谢谢。

更新

问题的原因是

self.model.create(...)

应该是(没有模型引用)

self.create(...)

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

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

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

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

最佳答案

问题可能在于:

  1. create 方法返回一个 promise ,它没有方法 exec
  2. 如果您想在自定义方法中使用 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;
};

希望对你有帮助

关于javascript - Mongoose - 链接 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094523/

相关文章:

node.js - 父对象上的 Mongoose Pre Save Hook 未执行

java - SQL 表到 nosql (MongoDB) - 简单的例子

javascript - Mongoose:改进 find() 和 count() 查询

javascript - 为什么我的带有确认按钮的 onclick 功能没有弹出?

触发python脚本的Javascript事件

javascript - 将 url 参数写入文件导致 "undefined"

mongodb - mongodb日志中的 "locks(micros) w:16035"和 "locks(micros) r:10051"是什么

javascript - 如何按间隔显示数组索引中的值

javascript - JSHINT 因以下行失败,接收错误 "Identifier ' mb_YTPlayer' 不是驼峰式大小写。”

javascript - 如何判断浏览器中是否存在数据?