如何在Express应用程序上处理运行时错误?

时间:2017-04-19 15:37:30

标签: node.js express

我是新来的表达+ node.js,所以我用mongoose编写了一个rest api。将运行时错误作为数据库错误等处理的最佳方法是什么?

我在快速文档中读到,您可以使用中间件function(err, res, req, next)来处理此错误,并且只能调用此函数调用next(err)。没关系,所以想象一下,你有一个User moongose模型,你可以在控制器中编写这个函数:

const find = (email, password) => {
  User.find({ email: email }, (err, doc) => {
    if (err) {
      // handle error
    }
    return doc;
  });
};

然后,您在另一个文件中有一个路由处理程序:

router.get('/users', (req, res) => {
    userController.find(req.body.email);
});

那么,此时,您可以处理在模型中编写throw(err)的mongo错误,并在控制器中使用try/catch然后调用next(err)对吗?但我已经读过在JavaScript中使用try/catch并不是一个好习惯,因为它会创建一个新的执行上下文等。

在Express中处理此错误的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我建议你使用promises。它不仅使您的代码更清晰,而且错误处理也更容易。作为参考,您可以访问thisthis

如果您使用的是猫鼬,您可以插入自己的承诺库。

const mongoose = require('mongoose');
mongoose.connect(uri);

// plug in the promise library:
mongoose.Promise = global.Promise;

mongoose.connection.on('error', (err) => {
  console.error(`Mongoose connection error: ${err}`)
  process.exit(1)
})

并使用如下:

在控制器中:

const find = (email) => {
  var userQuery = User.find({ email: email });
  return userQuery.exec();
};

在路由器中:

router.get('/users', (req, res) => {
    userController.find(req.body.email).then(function(docs){
      // Send your response
    }).then(null, function(err){
      //Handle Error
    });
});