Express.js如何处理错误?

所以,这件小事。 我们知道,Express有内置的默认error handling程序,它需要四个参数(err,req,res,next)来处理像ReferenceError,TypeError等那样的“同步exception”:

更新:这个问题是特定于Express,而不是如何捕捉未处理的exception/等。 我想知道如何在第一个代码块Express可以处理用户定义的exception。 第二个例子与asynchronous。 exception不直接属于这个问题。

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'...或域/ Promises / cluster。

也许我想念一些东西。

任何人都可以澄清?

在Express的路由器中有一个全部的模块被执行:

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

所以在这个模块中,所有的exception都会被捕获并转换成next()函数调用,其中error参数被设置为匹配exception。

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

  • 调用router.handle() ,然后确定路由器并调用router.handle()
  • router.handle()通过图层进行处理,并最终匹配您使用express.all('*', ...)签名注册的处理程序
  • handle_request (在路由器内部的Layer模块中)按照上面的try-catch块的规定调用你的处理函数,有效地捕获所有可能的exception,并将它们转换成下一个调用。