Q-promise和错误处理

时间:2014-05-15 07:33:15

标签: node.js mongoose promise q

我试图理解Q Promises以及如何处理从两个不同的块中抛出的两个不同的错误。

这是我想要“Promisfy”的功能:

router.post('/user', function(req, res) {
  var user = new User(req.body);
  User.findOne({ email: req.body.email }, function(error, foundUser) {
    if(foundUser) {
      res.send("Error: User with email " + foundUser.email + " already exists.", 409);
    } else {
      User.create(user, function(err, createdUser) {
        if (err) {
          res.send(err, 400);
        } else {
          res.json({ id: createdUser.id }, 201);
        }
      });
    }
  });  
});

它需要一些用户详细信息,并尝试创建一个新用户,如果已经存在同一个电子邮件。如果有的话,发送一个409.我也用400处理正常的猫鼬错误。

我已经尝试过使用mongoose-q将其转换过来了,我最终得到了这个:

router.post('/user', function(req, res) {
  var user = new User(req.body);
  User.findOneQ({email : req.body.email})
  .then(function(existingUser) {
    if (existingUser) {
      res.send("Error: User with email " + existingUser.email + " already exists.", 409);
    } 
    return User.create(user);
  })
  .then(function(createdUser) { 
    res.json({ id: createdUser.id }, 201); 
  })
  .fail(function(err) { 
    res.send(err, 400)
  })
});

这是对的吗?无论如何将现有用户检查推入故障块?即抛出一个错误,然后抓住并处理它?<​​/ p>

或许这样的事情:

router.post('/user', function(req, res) {
  var user = new User(req.body);
  User.findOneQ({email : req.body.email})
  .then(function(existingUser) {
    if (existingUser) {
      throw new Error("Error: User with email " + existingUser.email + " already exists.");
    } 
    return User.create(user);
  })
  .then(function(createdUser) { 
    res.json({ id: createdUser.id }, 201); 
  })
  .fail(function(duplicateEmailError) {
    res.send(duplicateEmailError.message)
  })
  .fail(function(mongoError) { 
    res.send(mongoError, 400)
  })
});

1 个答案:

答案 0 :(得分:1)

我对Q没有足够的经验。但是,我可以用蓝鸟回答。

bluebird支持类型捕获。这意味着您可以创建新的Error子类,抛出它们并相应地处理它们。

我在我的示例中使用newerror来简化Error子类的创建。

var newerror = require('newerror');

var DuplicateEmailError = newerror('DuplicateEmailError');

router.post('/user', function(req, res) {
    var user = new User(req.body);
    User.findOneAsync({ email: req.body.email }).then(function(existingUser) {
        if (existingUser) {
            throw new DuplicateEmailError('Error: User with email ' + existingUser.email + ' already exists.');
        }

        return User.createAsync(user);
    }).then(function(createdUser) {
        res.json({ id: createdUser.id }, 201);
    }).catch(DuplicateEmailError, function(err) {
        res.send(err.message, 409);
    }).catch(function(err) {
        res.send(err.message, 500);
    });
});