1. ホーム
  2. node.js

[解決済み] Mongoose save() がプロミスを返さない

2022-02-13 22:49:28

質問

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()しようとすると、プロミスIは動作しません。

何か見落としているのでしょうか?私はまた、user.save(...)を返そうとしましたが、それはまだ動作しませんでした。

私のメッセージを読んでいただきありがとうございます。

解決方法は?

まず、あなたの save(user) メソッドは現在 return であるため、結果は常に undefined は、Mongoose の動作に関係なく

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

しかし、Mongooseでは一般的に、それぞれのメソッドでコールバックかプロミスのどちらかを選択するようになっています。 ドキュメントでは、例のスニペットで暗示しているだけで、これについては特に明確ではありません。 現在、Mongoose のドキュメントでは、この点が明確にされています。 :

<ブロッククオート

を返します。

  • "プロミス,未定義" コールバックで使用された場合は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() )