Maison  >  Questions et réponses  >  le corps du texte

Comment rompre la chaîne de promesse lors de l'insertion dans la base de données si les données existent déjà dans la base de données ?

<p>J'utilise mangouste pour créer une nouvelle entrée de membre dans la base de données après avoir vérifié si le membre existe déjà dans la base de données. Je dois renvoyer une réponse si le membre existe déjà, sinon continuez à insérer le nouveau membre. Voici le code : </p> <pre class="brush:php;toolbar:false;">createNewMember = (req, res, next) => Member.findOne({email: email}).exec() .then((membres) => { if(membres == null || membres.length==0) { //Créer un nouvel objet membre return newMember.save() // 1 ---> } autre { res.status(409).json({message : "Le membre existe déjà"}) // 2 --> } }) .then((résultat) => { if(res.statusCode === 409) return res; // 3 --> J'ai ajouté ce hack pour résoudre le problème return res.status(201).json({message : "Le membre a été créé"}); // 4 --> puis bloc de newMember.save() }) .catch(erreur => { // Gère l'erreur et renvoie une réponse d'erreur })</pré> <p>Ce que je veux, c'est que si le processus atteint le point 2, la chaîne de promesses est rompue, mais le deuxième bloc est toujours appelé. Le point 3 est une vérification que j'ai ajoutée pour empêcher l'exécution du deuxième bloc, mais je ne pense pas que ce soit la meilleure façon de le gérer. Je pense qu'il s'agit d'un scénario courant, existe-t-il une meilleure solution ? </p>
P粉725827686P粉725827686429 Il y a quelques jours390

répondre à tous(1)je répondrai

  • P粉316110779

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

    Il n'y a aucun moyen de rompre la chaîne de promesses, sauf en lançant votre propre erreur et en passant au bloc catch. Cependant, vous ne souhaitez pas utiliser une erreur de ce type, car la situation elle-même n'est pas une erreur, mais simplement une situation logique spécifique (le membre existe déjà). Je recommande de considérer votre .then() comme des couches de gâteau avec des préoccupations différentes, comme ceci :

    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 => {
              // 处理错误并返回错误响应
         })
    

    répondre
    0
  • Annulerrépondre