Express.js如何处理错误?

时间:2017-07-28 07:59:22

标签: node.js express error-handling try-catch

所以,琐碎的事情。我们都知道Express有内置的默认错误处理程序,它需要四个参数(err,req,res,next)来处理"同步异常"比如ReferenceError,TypeError等:

更新:这个问题是特定于Express的,而不是关于如何捕获未处理的异常/等。我想知道在第一个代码块Express中如何处理用户定义的异常。第二个例子是异步。例外并不直接属于这个问题。

const express = require('express')();

express.all('*', (req, res) => {
  throw new Error('my own error');
  res 
    .send('okay?');
});

express.use((err, req, res, next) => {
  console.error(err.stack);
  res 
    .status(503)
    .send('Express is still up and running');
}).listen(3000);

但不是这样:

const express = require('express')();

express.all('*', (req, res) => {
  process.nextTick(() => {
    throw new Error('my own error');
  });
  res 
    .send('okay?');
});

express.use((err, req, res, next) => {
  console.error(err.stack);
  res 
    .status(503)
    .send('Won\'t be executed');
}).listen(3000);

但我对这个处理程序的实现感到好奇。

我找不到像

这样的东西

process.on('uncaughtException'...或domains / Promises / cluster。

也许我想念一些东西。

任何人都可以澄清吗?

1 个答案:

答案 0 :(得分:1)

执行catch-all kind of block in Express's router

try {
  fn(req, res, next);
} catch (err) {
  next(err);
}

因此,在此块中,所有异常都被捕获并转换为next()函数调用,并将错误参数设置为匹配异常。

更详细地说,当请求到达时表达:

    调用
  • app.handle(),然后确定路由器并调用router.handle()
  • router.handle()处理图层并最终匹配使用express.all('*', ...)签名
  • 注册的处理程序
  • handle_request(在路由器内部的Layer模块中)调用上述try-catch块中指定的处理函数,有效地捕获所有可能的异常并将它们转换为下一个调用。