搜尋

首頁  >  問答  >  主體

如果資料已經存在於資料庫中,如何在資料庫插入過程中打破承諾鏈?

<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粉725827686P粉725827686475 天前429

全部回覆(1)我來回復

  • P粉316110779

    P粉3161107792023-08-18 21:15:35

    除了拋出自己的錯誤並跳到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 => {
              // 处理错误并返回错误响应
         })
    

    回覆
    0
  • 取消回覆