Javascript mongoose静态方法返回蓝鸟承诺
我正在创建一个mongoose静态方法“load”,以便我的主控制器功能可以使用它(用于链接和错误处理) 问题是id有问题,所以我需要捕捉这个错误。我认为最好在模型层中这样做 当我执行以下操作时,控制器可以捕获此错误Javascript mongoose静态方法返回蓝鸟承诺,javascript,mongodb,mongoose,promise,bluebird,Javascript,Mongodb,Mongoose,Promise,Bluebird,我正在创建一个mongoose静态方法“load”,以便我的主控制器功能可以使用它(用于链接和错误处理) 问题是id有问题,所以我需要捕捉这个错误。我认为最好在模型层中这样做 当我执行以下操作时,控制器可以捕获此错误 UserSchema.statics.load = function(id) { if (!mongoose.Types.ObjectId.isValid(id)) { return Promise.resolve().then(function() {
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());
};
所以我的问题是我做的对吗?如果是这样,是否有更简单的方法来编写(*)语句?我正在做的事情看起来很难看。。谢谢。是的,有一个速记,叫做
承诺。拒绝
您的代码位于:
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
可以确保任何可能返回承诺的内容都将返回承诺:
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 trusted promise,并将throw
转换为拒绝。您可能需要考虑抛出一个子类:“代码>承诺”,“操作错误”/代码>而不是<代码>错误< /代码>。
作为一个不相关的技巧,Promise.cast
在一年多前被弃用,取而代之的是Promise.resolve
。如果我没有将所有承诺都投给蓝鸟承诺,那么Promise.method
中的承诺会有竞争条件吗?
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());
});