gpt4 book ai didi

javascript - Mongoose 静态方法返回一个 Bluebird promise

转载 作者:可可西里 更新时间:2023-11-01 09:20:18 27 4
gpt4 key购买 nike

我正在创建一个 mongoose 静态方法“load”,以便我的主 Controller 函数可以使用它(用于链接和错误处理)。

UserSchema.load('54ae92dd8b8eef540eb3a66d')
.then(....)
.catch(....);

问题是 id 有问题所以我需要捕获这个错误。我认为最好在模型层执行此操作。

当我执行以下操作时, Controller 可以捕获此错误。

UserSchema.statics.load = function(id) {

if (!mongoose.Types.ObjectId.isValid(id)) {
return Promise.resolve().then(function() {
throw new Error('not a mongoose id');
}); ------------( * )
}

return Promise.cast(this.findOne({
_id: id
}).exec());
};

但如果我只执行以下操作,错误将不会成功抛入 Controller 的 .catch 函数中。

AchievementSchema.statics.load = function(id) {
if (!mongoose.Types.ObjectId.isValid(id)) {
throw new Error('not a mongoose id');
}
return Promise.cast(this.findOne({
_id: id
}).exec());
};

所以我的问题是我这样做是否正确?如果是这样,是否有更简单的方法来编写 (*) 语句?我正在做的事情看起来很难看。谢谢。

最佳答案

是的,有一个叫做 Promise.reject 的简写。

您的代码在:

if (!mongoose.Types.ObjectId.isValid(id)) {
return Promise.resolve().then(function() {
throw new Error('not a mongoose id');
}); ------------( * )
}

可以写成:

return Promise.reject(new Error("Not a mongoose id");

您还可以做得更好,Promise.method 的存在是为了确保任何可能返回 promise 的东西返回 promise :

UserSchema.statics.load = Promise.method(function(id) {

if (!mongoose.Types.ObjectId.isValid(id)) {
throw new Error('not a mongoose id: ' + id);
}
return this.findOne({ _id: id }).exec());
});

这会将 findOne 结果转换为 Bluebird 可信 promise ,并将 throw 转换为拒绝。不过,您可能需要考虑抛出 Promise.OperationalError 的子类,而不是 Error

作为一个不相关的提示,Promise.cast 在一年前被弃用,取而代之的是 Promise.resolve

关于javascript - Mongoose 静态方法返回一个 Bluebird promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843497/

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