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,并将它们转换成下一个调用。