猫鼬save()不返回承诺

3 mongoose node.js promise

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();
    });
}
Run Code Online (Sandbox Code Playgroud)

请注意,用户参数为:

mongoose.model('User', this.userSchema);
Run Code Online (Sandbox Code Playgroud)

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

console.log((userRepository.save(user) instanceof Promise));
Run Code Online (Sandbox Code Playgroud)

当然,当我尝试then()承诺时,我没有用。

我想念什么吗?我也尝试返回user.save(...),但仍然无法正常工作。

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

Jon*_*ski 5

首先,您的save(user)方法当前return本身什么都没有,因此结果始终undefined与Mongoose的行为无关:

console.log(typeof userRepository.save(user) === 'undefined'); // true
Run Code Online (Sandbox Code Playgroud)

但是,Mongoose通常使您可以使用其每个方法选择回调或Promise。除了通过示例片段暗示它之外,文档还不是很清楚: Mongoose的文档现在可以澄清这一点

返回值:

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

打回来:

product.sold = Date.now();
product.save(function (err, product) {
  if (err) ..
})
Run Code Online (Sandbox Code Playgroud)

诺言:

product.save().then(function(product) {
   ...
});
Run Code Online (Sandbox Code Playgroud)

在您的情况下,如果您想返回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());
}
Run Code Online (Sandbox Code Playgroud)

(注意:关于.finally()