【问题标题】:Mongoose save() doesn't return promise猫鼬保存()不返回承诺
【发布时间】:2018-08-19 06:26:35
【问题描述】:

Mongoose 的文档确认方法 save 返回一个承诺。我想使用这种方法在我的数据库中保存一个用户模型。我就是这样做的:

save (user) {
    user.save((err, user) => {
        if (err) {
            return handleError(err);
        } else {
            console.log('The user ' + user.screenName + ' has been added.');
        }

        this.db.close();
    });
}

注意用户参数是:

mongoose.model('User', this.userSchema);

我不明白为什么下面的 console.log 返回 false :

console.log((userRepository.save(user) instanceof Promise));

当然,当我尝试 then() 时,我的承诺是行不通的。

我错过了什么吗?我也尝试过返回 user.save(...) 但还是不行。

感谢您阅读我的信息,祝您有美好的一天!

【问题讨论】:

    标签: node.js mongoose promise


    【解决方案1】:

    首先,您的 save(user) 方法本身目前没有 return 任何东西,因此无论 Mongoose 的行为如何,结果将始终为 undefined

    console.log(typeof userRepository.save(user) === 'undefined'); // true
    

    不过,Mongoose 通常会让您在其每个方法中选择回调或承诺。 除了通过示例 sn-ps 暗示之外,文档对此并不是特别清楚: Mongoose's documentation does now clarify this:

    返回:

    • «Promise,undefined» 如果与回调一起使用,则返回 undefined,否则返回 Promise。

    回调:

    product.sold = Date.now();
    product.save(function (err, product) {
      if (err) ..
    })
    

    承诺:

    product.save().then(function(product) {
       ...
    });
    

    在你的情况下,如果你想返回一个Promise,那么你的save(user)方法也必须使用return他们:

    save (user) {
        return user.save()
            .then(user => console.log('The user ' + user.screenName + ' has been added.'))
            .catch(err => handleError(err))
            .finally(() => user.db.close());
    }
    

    (注:regarding .finally()

    【讨论】:

    • 非常感谢乔纳森·洛诺夫斯基!
    • 嗨@JonathanLonowski,您将如何制作上面的示例 aync ?会不会是:async save (user) { return await user.save() .then(user => console.log('The user ' + user.screenName + ' has been added.')) .catch(err => handleError(err)) .finally(() => user.db.close()); }
    猜你喜欢
    • 2021-12-04
    • 2018-02-15
    • 2019-02-13
    • 2013-06-29
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2015-05-12
    • 2020-12-24
    相关资源
    最近更新 更多