猫鼬保存()不返回承诺

Posted

技术标签:

【中文标题】猫鼬保存()不返回承诺【英文标题】: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(...) 但还是不行。

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

【问题讨论】:

【参考方案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());

以上是关于猫鼬保存()不返回承诺的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬批量保存承诺

猫鼬承诺错误

猫鼬在保存前等待查找完成

使用猫鼬的抽象类

猫鼬承诺和Q承诺

使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是啥?