停止处理promise.then

时间:2018-01-13 23:06:00

标签: javascript node.js express sequelize.js

所以,我开始了我的nodejs之旅。我有其他语言的经验,但承诺概念对我来说很新鲜。

我的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({ /* ... */});
});

基本上我想要的是当用户已经存在时停止处理。我(想)知道我可以在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 */
});

感谢

1 个答案:

答案 0 :(得分:1)

由于必须捕获所有不成功(警告/错误)响应,因此存在.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);