猫鼬静态方法 returns 蓝鸟承诺
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());
};
所以我的问题是我这样做是否正确?如果是这样,是否有更简单的方法来编写 (*) 语句?我在做什么看起来很丑..谢谢。
是的,有一个 shorthand 叫做 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
的存在是为了确保任何可能 return 的承诺 将 return 承诺:
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 可信承诺,并将 throw
转换为对您的拒绝。不过,您可能要考虑抛出 Promise.OperationalError
而不是 Error
的子类。
作为一个不相关的提示,Promise.cast
在一年前被弃用,取而代之的是 Promise.resolve
。
我正在创建一个 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());
};
所以我的问题是我这样做是否正确?如果是这样,是否有更简单的方法来编写 (*) 语句?我在做什么看起来很丑..谢谢。
是的,有一个 shorthand 叫做 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
的存在是为了确保任何可能 return 的承诺 将 return 承诺:
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 可信承诺,并将 throw
转换为对您的拒绝。不过,您可能要考虑抛出 Promise.OperationalError
而不是 Error
的子类。
作为一个不相关的提示,Promise.cast
在一年前被弃用,取而代之的是 Promise.resolve
。