【问题标题】:Node.js (Express) error handling middleware with router带有路由器的 Node.js (Express) 错误处理中间件
【发布时间】:2017-09-07 11:26:43
【问题描述】:

这是我的应用程序结构:

- app.js
- routes
---- index.js

ExpressJS 应用程序为developmentproduction 环境创建错误处理程序。这是来自app.js的代码sn-p:

app.use('/', routes); // routing is handled by index.js in the routes folder

//The following middleware are generated when you create the Express App

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function (err, req, res, next) {
        res.status(err.status || 500);
        res.render('error.ejs', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

routes/index.js 内部,我处理所有路由:

var router = express.Router();

router.get('/', function (req, res) {
    someAsyncFunction(function(err, result) {
        if (err) throw err; // Handle this error
    }
});

module.exports = router;

我希望将 err 传递给错误处理程序之一,而不是被抛出。我该怎么做?

【问题讨论】:

    标签: javascript node.js express error-handling


    【解决方案1】:

    你必须将它传递给下一个回调,通常是路由处理程序中的第三个参数

    var router = express.Router();
    
    router.get('/', function (req, res, next) {
        someAsyncFunction(function(err, result) {
            if (err) {
                next(err); // Handle this error
            }
        }
    });
    
    module.exports = router;
    

    调用next(err) 将允许在具有以下签名的中间件中捕获错误:

    app.use(function (err, req, res, next){
        // do something about the err
    });
    

    参考:http://expressjs.com/en/guide/error-handling.html

    【讨论】:

      【解决方案2】:

      您还可以创建一个中间件函数来处理所有路由中的错误,而无需到处复制代码,如果您愿意,可以使用箭头函数。

      1) 创建一个 const 函数来处理错误。

      要么:

      const handleErrorAsync = func => (req, res, next) => {
          func(req, res, next).catch((error) => next(error));
      };
      

      const handleErrorAsync = func => async (req, res, next) => {
          try {
              await func(req, res, next);
          } catch (error) {
              next(error);
          }
      };
      

      2) 在您的路由器中为每个请求使用它:

      var router = express.Router();
      
      router.get('/req1', handleErrorAsync(async (req, res, next) => {
         let result = await someAsyncFunction1();
         if(result){
             // res.send whatever
         }
      }));
      router.post('/req2', handleErrorAsync(async (req, res, next) => {
          let result = await someAsyncFunction2(req.body.param1);
          if(result){
              // res.send whatever
          }
      }));
      router.post('/req3', handleErrorAsync(async (req, res, next) => {
          let result = await someAsyncFunction3(req.body.param1, req.body.param2);
          if(result){
              // res.send whatever
          }
      }));
      
      module.exports = router;
      

      3)在你的服务器主应用句柄错误:

      // development error handler
      // will print stacktrace
      if (app.get('env') === 'development') {
          app.use(function (err, req, res, next) {
              res.status(err.status || 500);
              res.render('error.ejs', {
                  message: err.message,
                  error: err
              });
          });
      }
      
      // production error handler
      // no stacktraces leaked to user
      app.use(function (err, req, res, next) {
          res.status(err.status || 500);
          res.render('error', {
              message: err.message,
              error: {}
          });
      });
      

      这样您就可以在任何路由中重用错误处理功能。此外,如果您的任何函数中有任何未处理的错误,这也会捕获它们。

      尝试从Here捕获错误处理

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 2012-02-22
        • 2021-12-23
        • 1970-01-01
        • 2017-05-30
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多