javascript - 在 promise.then 中停止处理

标签 javascript node.js express sequelize.js

于是,我开始了我的 nodejs 之旅。我有使用其他语言的经验,但 promises 概念对我来说很陌生。

我的nodejs环境是expressjs + sequelize。 我正在创建一个基本的寄存器流程,但我遇到了一个基本问题:如何在 then

中停止处理
router.post('/new', function(req, res, next) {
    /* some code here */
    db.user
      .findOne({email: req.body.email})
      .then(user =>{
          console.log(user);
          if(user){
            console.log('Info: Email "'+req.body.email+'" already exists.');
            res.json( {
              meta:{
                success: false,
                message: 'Email "'+req.body.email+'" already exists.',
              }
            });
            return; // <------ 
          }
        })
      .catch(err =>{
        console.log(err);
        return; // <------ 
      });

    db.user.create({ /* ... */});
});

基本上我想要的是在用户已经存在时停止处理。我(认为)知道我可以将 create 移到 findOne 中,但感觉不对。

router.post('/new', function(req, res, next) {
db.user
      .findOne({email: req.body.email})
      .then(user =>{
          if(user){
            console.log('Info: Email "'+req.body.email+'" already exists.');
            res.json( {
              meta:{
                success: false,
                message: 'Email "'+req.body.email+'" already exists.',
              }
            });
          } else {
              db.user.create({ /* ... */});
          }
        })
      .catch(err =>{
        console.log(err);
        return; // <------ this is too
      });
    /* no code here */
});

谢谢

最佳答案

因为必须捕获所有不成功的(警告/错误)响应,所以有 .catch。可以有选择地捕获错误。这是关于个人方法,所以我将如何解决这个问题:

// fake db call; set userReturned if user should be returned; userReturned=string
function dbUserCall(userReturned) {
  return new Promise(resolve => setTimeout(resolve, 500, userReturned));
}

// custom error type
function UserExistErr(user) {
  this.msg = 'User ' + user + ' already exists';
  this.user = user;
}

// returns always promise
function createUser(user) {
  if (user)
    return Promise.reject(new UserExistErr(user));
    
  console.log('Info: User does not exist. Creating new one..');
  return dbUserCall('John');
}

function catchRespErr(err) {
  switch (err.constructor) {
    case UserExistErr:
      console.log('Warning: ' + err.msg);
      // set warning res
      break;
    default:
      console.log('Error: ' + err);
      // set default error res
  }
}

dbUserCall('Jack')
  .then(createUser)
  .then(user => console.log('Info: User '+ user +' created!'))
  .catch(catchRespErr);

关于javascript - 在 promise.then 中停止处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245121/

相关文章:

node.js - 如何获得对 http 请求文件上传中止的响应?

javascript - 无法让我的 Javascript 添加或删除类

javascript - 如何根据用户选择的选项更改链接 href (onclick)

javascript - 为什么 php 变量不能与 javascript 循环一起使用?

javascript - Node.js Express 与 Azure 错误请求

android - 错误 : EPERM: operation not permitted

javascript - Node (Express) 上的套接字 IO 的 cURL 请求

javascript - 从父状态重新排序子组件时出现问题

node.js - NodeJS : for loop and promises

Node.js IPv6 问题