[英]mongoose static method returns a bluebird promise
我正在创建一个mongoose静态方法'load',以便我的主控制器功能可以使用它(用于链接和错误处理)。
UserSchema.load('54ae92dd8b8eef540eb3a66d')
.then(....)
.catch(....);
事情是id是错误的,所以我需要抓住这个错误。 我认为最好在模型层中执行此操作。
当我执行以下操作时,控制器可以捕获此错误。
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());
};
但是,如果我只执行以下操作,则错误未成功抛入控制器.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
结果,并将throw
转换为拒绝。 您可能想要考虑抛出Promise.OperationalError
的子类而不是Error
。
作为一个不相关的尖端Promise.cast
是赞成不赞成的Promise.resolve
在一年前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.