问题示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| const express = require('express');
const app = express();
app.get('/', async (req, res, next) => {
throw new Error('test error');
});
app.use(async function (error, req, res, next) {
console.log('will not print'); // 这里无法捕获到错误, 关键点在于action是异步方法
res.json({ message: error.message || error });
});
const server = app.listen(3000, function () {
console.log('server started...');
});
|
定义的错误中间件无法捕获到 action 抛出的错误, 解决办法 如下:
解决方法一
不要直接抛错, 用 next()
1
2
3
| app.get('/', async (req, res, next) => {
next(new Error('test error'));
});
|
解决办法二
自定义一个 action 的处理函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| const express = require('express');
const app = express();
const asyncMiddleware = (fn) => async (req, res, next) => {
try {
const data = await fn(req, res, next);
return data;
} catch (err) {
next(err);
}
};
app.get(
'/',
asyncMiddleware(async (req, res, next) => {
throw new Error('test error');
})
);
app.use(async function (error, req, res, next) {
console.log('will print');
res.json({ message: error.message || error });
});
const server = app.listen(3000, function () {
console.log('server started...');
});
|
解决办法三
利用第三方包 express-async-errors
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| const express = require('express');
const app = express();
require('express-async-errors');
app.get('/', async (req, res, next) => {
throw new Error('test error');
});
app.use(async function (error, req, res, next) {
console.log('will print');
res.json({ message: error.message || error });
});
const server = app.listen(3000, function () {
const host = server.address().address;
const port = server.address().port;
console.log('server start', host, port);
});
|