如果資料已經存在於資料庫中,如何在資料庫插入過程中打破承諾鏈?
P粉725827686
2023-08-17 23:08:43
<p>我正在使用mongoose來在檢查成員是否已經存在於資料庫中後,在資料庫中建立一個新的成員條目。如果成員已經存在,我需要回傳一個回應,否則繼續插入新的成員。
以下是代碼:</p>
<pre class="brush:php;toolbar:false;">createNewMember = (req, res, next) => {
Member.findOne({email: email}).exec()
.then((members) => {
if(members == null || members.length==0) {
// 建立新的成員對象
return newMember.save() // 1 --> 回傳promise
} else {
res.status(409).json({message: "成員已存在"}) // 2 --> 我想要返回
}
})
.then((result) => {
if(res.statusCode === 409) return res; // 3 --> 我加入了這個hack來解決問題
return res.status(201).json({message: "成員已建立"}); // 4 --> newMember.save()的then區塊
})
.catch(err => {
// 處理錯誤並傳回錯誤回應
})</pre>
<p>我想要的是,如果流程到達點2,就中斷promise鏈,但第二個then區塊仍然被呼叫。點3是我新增的檢查,以防止第二個then區塊被執行,但我認為這不是處理它的最佳方式。
我相信這是一個常見的場景,有更好的方法嗎? </p>
除了拋出自己的錯誤並跳到catch區塊之外,沒有辦法打破promise鏈。但是,您不希望像那樣使用錯誤,因為情況本身並不是一個錯誤,而只是一種特定的邏輯情況(成員已經存在)。我建議將您的.then()視為具有不同關注點的蛋糕層,如下所示: