Mongoose的save()方法不返回Promise

9

Mongoose的文档确认保存方法返回一个Promise。我想使用这个方法将用户模型保存到我的数据库中。我可以像这样做:

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()方法时,这个promise不起作用。

我错过了什么吗? 我还尝试返回user.save(...),但仍然无效。

感谢阅读我的信息,祝你有愉快的一天!

1个回答

16

首先,您的save(user)方法目前没有自己的return语句,因此无论Mongoose的行为如何,结果始终为undefined

首先,您的save(user)方法目前没有自己的return语句,因此无论Mongoose的行为如何,结果始终为undefined

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

然而,Mongoose通常会让你在其每个方法中选择使用回调函数或Promise。关于这一点文档并没有特别清晰的说明,只通过示例片段暗示了这一点。不过,现在Mongoose的文档已经明确说明了这一点

返回值:

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

(注:关于.finally()的信息,请参考此处。)


非常感谢Jonathan Lonowski! - user9022931
嗨@JonathanLonowski,您如何将上面的示例变成异步? 会是这样吗: async save (user) { return await user.save() .then(user => console.log('用户' + user.screenName + '已添加。')) .catch(err => handleError(err)) .finally(() => user.db.close()); } - O'Dane Brissett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接