【问题标题】:Using Mongoose promises to do find and update使用 Mongoose 承诺进行查找和更新
【发布时间】:2014-06-24 04:33:20
【问题描述】:

我正在尝试使用 Mongoose Promises 来获得更简洁的代码(请参阅嵌套函数)。 具体来说,我正在尝试构建这样的东西:

Model.findOne({_id: req.params.id, client: req.credentials.clientId}).exec()
   .then(function(resource){
      if (!resource) {
        throw new restify.ResourceNotFoundError();
      }
      return resource;
    })
    .then(function(resource) {
      resource.name = req.body.name;
      return resource.save; <-- not correct!
    })
    .then(null, function(err) {
       //handle errors here
    });

因此,在其中一个承诺中,我需要保存我的模型。在最新的稳定版本中,Model.save() 不返回承诺(错误为 here)。

要使用经典的保存方法,我可以使用这个:

   //..before as above
   .then(function(resource) {
      resource.name = req.body.name;
      resource.save(function(err) {
        if (err)
            throw new Error();
        //how do I return OK to the parent promise?
      });
    })

但正如代码中所注释的,我如何将保存回调(异步运行)的返回值返回到持有承诺?

有没有更好的办法?

(顺便说一句,findOneAndUpdate 对我来说是一个不可行的解决方案)

【问题讨论】:

标签: node.js mongoose promise


【解决方案1】:

一种方法是将 .save 代码包装在您自己的方法中,该方法返回一个承诺。你需要一个 promise 库,比如 RSVP 或 Q。我会用 RSVP 编写它,但你应该明白了。

var save = function(resource) {
  return new RSVP.Promise(function(resolve, reject) {
    resource.save(function(err, resource) {
      if (err) return reject(err);
      resolve(resource);
    });
  });
}

然后在你的调用代码中:

// ...

.then(function(resource) {
  resource.name = req.body.name;
  return save(resource);
})
.then(function(resource) {
  // Whatever
})
.catch(function(err) {
 // handle errors here
});

另一种方法是节点化保存方法,但我会按照上面详述的方式进行。

【讨论】:

  • 我建议使用 Bluebird 而不是 RSVP,因为它更快且更易于调试。蓝鸟成功了var save = Promise.promisify(someResource.prototype.save)
  • @BenjaminGruenbaum 虽然 RSVP 它像 JohnnyHall 所写的那样工作,但似乎 Bluebird 的 Promise 实现与 Mongoose 的不兼容(它总是需要运行 catch 函数的承诺)......仍然如此看起来更干净,使用起来会很好......有任何线索吗?
  • 是的,问题在于函数的范围。最后,我选择了return Promise.promisify(resource.save,resource)();
猜你喜欢
  • 2019-10-21
  • 2021-08-06
  • 2020-09-16
  • 1970-01-01
  • 2015-01-21
  • 2018-05-07
  • 2012-08-23
  • 2013-04-08
  • 2020-12-15
相关资源
最近更新 更多