gpt4 book ai didi

node.js - 使用 Mongoose promise 进行查找和更新

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:27 26 4
gpt4 key购买 nike

我正在尝试使用 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
});

因此,在其中一个 promise 中,我需要保存我的模型。从最新的稳定版本开始,Model.save() 不会返回 promise (错误为 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?
});
})

但正如代码中所评论的那样,如何将保存回调(异步运行)的返回值返回到持有 promise ?

有更好的方法吗?

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

最佳答案

一种方法是将 .save 代码包装在您自己的方法中,该方法返回一个 promise 。您需要一个 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
});

另一种方法是 Node 化 save 方法,但我会按照上面详细介绍的方式进行操作。

关于node.js - 使用 Mongoose promise 进行查找和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23513724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com