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

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

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

  1. createNewMember = (req, res, next) => {
  2. Member.findOne({email: email}).exec()
  3. .then((members) => {
  4. if(members == null || members.length==0) {
  5. // create newMember object
  6. return newMember.save() // 1 --> promise returned
  7. } else {
  8. res.status(409).json({message: "Member already present"}) // 2 --> I want to return
  9. }
  10. })
  11. .then((result) => {
  12. if(res.statusCode === 409) return res; // 3 --> I added this hack to resolve the problem
  13. return res.status(201).json({message: "member created"}); // 4 --> then block for newMember.save()
  14. })
  15. .catch(err => {
  16. // handle error and return error response
  17. })

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

7y4bm7vi

7y4bm7vi1#

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

  1. createNewMember = async (req, res, next) => {
  2. try {
  3. const members = await Member.findOne({email}).exec();
  4. if (members?.length) return res.status(409).json({message: "Member already present"});
  5. // create newMember object
  6. // ...
  7. await newMember.save();
  8. res.status(201).json({message: "Member created"});
  9. } catch(err) {
  10. // handle error and return error response
  11. // ...
  12. }
  13. }
yrdbyhpb

yrdbyhpb2#

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

  1. Member.findOne({email: email}).exec()
  2. // DB layer
  3. .then((members) => {
  4. // If member does not exist, begin saving and return promise
  5. if(members == null || members.length==0) {
  6. // create newMember object
  7. return newMember.save() // 1 --> promise returned
  8. }
  9. // If member exists, return undefined
  10. else {
  11. return;
  12. }
  13. })
  14. // Response Layer
  15. .then((newMember) => {
  16. let statusCode;
  17. let message;
  18. // On .save() success, the promise resolves to the new member
  19. if(newMember) {
  20. statusCode = 201;
  21. message = "member created";
  22. }
  23. // If we returned undefined in the first then(), we'd land here
  24. else {
  25. statusCode = 409;
  26. message = "Member already present";
  27. }
  28. return res.status(statusCode).json({message});
  29. })
  30. .catch(err => {
  31. // handle error and return error response
  32. })
展开查看全部

相关问题