[英]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.