Wie kann die Versprechenskette beim Einfügen in die Datenbank unterbrochen werden, wenn die Daten bereits in der Datenbank vorhanden sind?
P粉725827686
P粉725827686 2023-08-17 23:08:43
0
1
436
<p>Ich verwende Mongoose, um einen neuen Mitgliedseintrag in der Datenbank zu erstellen, nachdem ich überprüft habe, ob das Mitglied bereits in der Datenbank vorhanden ist. Ich muss eine Antwort zurückgeben, wenn das Mitglied bereits existiert, andernfalls fahre ich mit dem Einfügen des neuen Mitglieds fort. Hier ist der Code: </p> <pre class="brush:php;toolbar:false;">createNewMember = (req, res, next) => Member.findOne({email: email}).exec() .then((members) => { if(members == null || member.length==0) { //Neues Mitgliedsobjekt erstellen return newMember.save() // 1 --> } anders { res.status(409).json({message: „Mitglied existiert bereits“}) // 2 --> } }) .then((result) => { if(res.statusCode === 409) return res; // 3 --> Ich habe diesen Hack hinzugefügt, um das Problem zu lösen return res.status(201).json({message: „Mitglied wurde erstellt“}); // 4 --> }) .catch(err => { // Den Fehler behandeln und eine Fehlerantwort zurückgeben })</pre> <p>Was ich möchte ist, dass, wenn der Prozess Punkt 2 erreicht, die Versprechenskette unterbrochen wird, aber der zweite then-Block immer noch aufgerufen wird. Punkt 3 ist eine Prüfung, die ich hinzugefügt habe, um zu verhindern, dass der zweite then-Block ausgeführt wird, aber ich glaube nicht, dass dies der beste Weg ist, damit umzugehen. Ich glaube, das ist ein häufiges Szenario. Gibt es einen besseren Weg? </p>
P粉725827686
P粉725827686

Antworte allen(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 => {
          // 处理错误并返回错误响应
     })
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage