【问题标题】:mongoose static method returns a bluebird promise猫鼬静态方法返回一个蓝鸟承诺
【发布时间】:2015-03-06 18:24:03
【问题描述】:

我正在创建一个猫鼬静态方法“加载”,以便我的主控制器功能可以使用它(用于链接和错误处理)。

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());
};

所以我的问题是我这样做是否正确?如果是这样,是否有更简单的方法来编写 (*) 语句?我在做什么看起来很丑……谢谢。

【问题讨论】:

    标签: javascript mongodb mongoose promise bluebird


    【解决方案1】:

    是的,有一个叫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 的存在是为了确保任何可能返回承诺返回承诺:

    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 信任的 Promise 并将 throw 转换为您的拒绝。不过,您可能需要考虑抛出 Promise.OperationalError 的子类而不是 Error

    作为一个不相关的提示,Promise.cast 在一年前已被弃用,取而代之的是 Promise.resolve

    【讨论】:

    • 如果我不将所有的承诺都投给 bluebird 承诺,Promise.method 中的承诺是否会有竞争条件?
    猜你喜欢
    • 2015-10-27
    • 2016-06-10
    • 2015-11-19
    • 2016-09-23
    • 2016-06-04
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多