データがすでにデータベースに存在する場合、データベースの挿入中に Promise チェーンを破るにはどうすればよいですか?
P粉725827686
2023-08-17 23:08:43
<p>メンバーがデータベースにすでに存在するかどうかを確認した後、mongoose を使用してデータベースに新しいメンバー エントリを作成しています。メンバーがすでに存在する場合は応答を返す必要があり、そうでない場合は新しいメンバーの挿入を続行します。
コードは次のとおりです: </p>
<pre class="brush:php;toolbar:false;">createNewMember = (req, res, next) => {
Member.findOne({電子メール: 電子メール}).exec()
.then((メンバー) => {
if(メンバー == null || members.length==0) {
//新しいメンバーオブジェクトを作成する
return newMember.save() // 1 --> プロミスを返す
} それ以外 {
res.status(409).json({message: "メンバーはすでに存在します"}) // 2 --> 戻りたい
}
})
.then((結果) => {
if(res.statusCode === 409) return res; // 3 --> 問題を解決するためにこのハックを追加しました
return res.status(201).json({message: "メンバーが作成されました"}); // 4 -->> newMember.save() のブロック
})
.catch(err => {
// エラーを処理し、エラー応答を返します。
})</pre>
<p>私が望むのは、プロセスがポイント 2 に到達すると、Promise チェーンは壊れますが、2 番目の then ブロックは引き続き呼び出されることです。ポイント 3 は、2 番目の then ブロックが実行されないようにするために追加したチェックですが、これを処理する最善の方法とは思えません。
これは一般的なシナリオだと思いますが、より良い方法はありますか? </p>
Promise チェーンを破るには、独自のエラーをスローして catch ブロックにジャンプする以外に方法はありません。ただし、このようなエラーは使用しないでください。これは、状況自体はエラーではなく、単なる特定の論理状況 (メンバーがすでに存在している) にすぎないためです。 .then() を、次のようにさまざまな懸念事項を含むケーキの層として考えることをお勧めします。 リーリー