首页  >  问答  >  正文

如果数据已经存在于数据库中,如何在数据库插入过程中打破承诺链?

<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粉725827686451 天前408

全部回复(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
  • 取消回复