从express中的mongoose查询中捕获错误

时间:2014-06-05 11:40:37

标签: javascript node.js express mongoose

如何从mongoose查询中捕获错误。在我的路线中我得到了这样的东西:

// router.js
router.route('/signup')
    .post(function(req, res) {
        var profile = new Profile(); // create a new instance of the profile model
        profile.username    = req.body.username;
        profile.password    = profile.generateHash(req.body.password);
        profile.save(function(err) {
            if (err) { // (A)
                throw new Error('user/create error'));
            } else {
                res.json(200, { user_token: profile._id, username: profile.username }); 
            }
        });
    });

在我的应用程序中,我设置了我的路线:

// app.js
var router = require('./app/routes/routes'); 
// global-error handling middleware
app.use(function(err, req, res, next) {
    console.log('Some error is happening.');
    res.json(500, {status: 500, message: err.message});

});

如果我生成错误,那么我在上面的代码中找到//(A)行,我得到一个堆栈跟踪并且node.js存在。我想在我的错误处理程序中捕获错误。我该怎么做?

2 个答案:

答案 0 :(得分:1)

嗯,您已经在请求处理程序中,并且您已经可以访问保存配置文件对象时产生的错误。所以,没有必要在这里抛出异常。您可以已经处理问题。

此处最可能的情况是向用户发送回复,指示保存配置文件失败。

function(req, res) {
   profile.save(function(err) {
      if (err) { // (A)
        res.send(500, {message: 'Failed to save profile'}
      } else {
         res.json(200, { user_token: profile._id, username: profile.username }); 
      }
  });
}

就是这样。您的客户端将收到500状态错误,这显然表示您的客户需要处理的问题,例如通知用户,进行重试等等。

答案 1 :(得分:0)

您可以使用类似Promise的错误处理。猫鼬允许在其方法上使用promise:

profile.save().then((doc) => {
        // if done correctly
}).catch((err) => {
    // catch error if occurs
    // handle error
});
  • 您可以了解有关猫鼬内置承诺there的更多信息。