mongoose 如果数据库中已经存在数据,如何在数据库插入期间破坏承诺链?

6yoyoihd  于 2023-10-19  发布在  Go
关注(0)|答案(2)|浏览(129)

我使用mongoose在检查成员是否已经存在于数据库中后,在数据库中创建一个新的成员条目。如果成员已经存在,我需要返回一个响应,否则继续插入新的。下面是代码:

createNewMember = (req, res, next) => {

Member.findOne({email: email}).exec()
    .then((members) => {
         if(members == null || members.length==0) {
              // create newMember object
              return newMember.save()   // 1 --> promise returned
         } else {
             res.status(409).json({message: "Member already present"})    // 2 --> I want to return 
         }
     })
     .then((result) => {
          if(res.statusCode === 409) return res;  // 3 --> I added this hack to resolve the problem
          return res.status(201).json({message: "member created"}); // 4 --> then block for newMember.save()
     })
     .catch(err => {
          // handle error and return error response
     })

我想要的是,如果flow到达第2点,但第二个then块被调用,则中断promise链。第3点是我添加的检查,以防止第二个then块被执行,但我不认为这是处理它的最佳方法。我相信这是一个常见的场景,有没有更好的方法来做到这一点?

7y4bm7vi

7y4bm7vi1#

如果使用asyncawait重写逻辑,事情会变得更容易:

createNewMember = async (req, res, next) => {
    try {
        const members = await Member.findOne({email}).exec();
        if (members?.length) return res.status(409).json({message: "Member already present"});
        // create newMember object
        // ...
        await newMember.save();
        res.status(201).json({message: "Member created"});
    } catch(err) {
        // handle error and return error response
        // ...
    }
}
yrdbyhpb

yrdbyhpb2#

除了抛出自己的Error并跳到catch块之外,没有其他方法可以打破promise链。但是,你不想像那样使用Error's,因为这种情况本身不是Error,它只是某种逻辑环境(成员已经存在)。我建议您将.then()看作是蛋糕层,具有单独的关注点,如下所示:

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

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

         // If member does not exist, begin saving and return promise
         if(members == null || members.length==0) {
              // create newMember object
              return newMember.save()   // 1 --> promise returned
         } 

         // If member exists, return undefined
         else {
             return;
         }
     })

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

         // On .save() success, the promise resolves to the new member
         if(newMember) {
           statusCode = 201;
           message = "member created";
         }

         // If we returned undefined in the first then(), we'd land here
         else {
           statusCode = 409;
           message = "Member already present";
         }

         return res.status(statusCode).json({message});
     })
     .catch(err => {
          // handle error and return error response
     })

相关问题