簡體   English   中英

mongoose static方法返回bluebird promise

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM