Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose静态方法返回蓝鸟承诺_Javascript_Mongodb_Mongoose_Promise_Bluebird - Fatal编程技术网

Javascript mongoose静态方法返回蓝鸟承诺

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() {

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

问题是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());
};
但是,如果我只执行以下操作,则错误不会成功地抛出到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());
});