如果資料已經存在於資料庫中,如何在資料庫插入過程中打破承諾鏈?
P粉725827686
P粉725827686 2023-08-17 23:08:43
0
1
417
<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>
P粉725827686
P粉725827686

全部回覆(1)
P粉316110779

除了拋出自己的錯誤並跳到catch區塊之外,沒有辦法打破promise鏈。但是,您不希望像那樣使用錯誤,因為情況本身並不是一個錯誤,而只是一種特定的邏輯情況(成員已經存在)。我建議將您的.then()視為具有不同關注點的蛋糕層,如下所示:

Member.findOne({email: email}).exec()

    // DB layer
    .then((members) => {

         // 如果成员不存在,则开始保存并返回promise
         if(members == null || members.length==0) {
              // 创建newMember对象
              return newMember.save()   // 1 --> 返回promise
         } 

         // 如果成员存在,则返回undefined
         else {
             return;
         }
     })

     // Response Layer
     .then((newMember) => {
         let statusCode;
         let message;

         // 在.save()成功时,promise解析为新成员
         if(newMember) {
           statusCode = 201;
           message = "成员已创建";
         }

         // 如果我们在第一个.then()中返回了undefined,我们会到达这里
         else {
           statusCode = 409;
           message = "成员已存在";
         }

         return res.status(statusCode).json({message});
     })
     .catch(err => {
          // 处理错误并返回错误响应
     })
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板