1. 同步错误
app.get('/', (req, resp) => {
if(!req.query.name) {
throw new Error('name query parameter required');
}
resp.end('ok');
});
2. 异步错误
异步错误,发生在回调函数中,需要通过next(err),才能捕获异步错误。
app.get('/', (req, resp, next) => {
fs.readFile('./example.js', { encoding: 'utf8'}, (err, data) => {
if(err) {
next(err);
return;
}
resp.end(data);
});
});
3. 自定义错误处理函数
function errorHandler(err, req, resp, next)
- err: 错误对象
- req: 请求对象
- resp: 响应对象
- next: 下一个错误处理器
错误处理器的本质也是中间件,需要放在所有中间件和路由函数的后面
const express = require('express');
const fs = require('fs');
const app = express();
// 设置路由
app.get('/', (req, resp, next) => {
throw new Error('have errors');
});
// 使用自定义错误处理记录日志并将error传递到下一个错误处理器
app.use((err, req, resp, next) => {
fs.writeFile('./error.log',
`${req.method} ${req.url} Error: ${err.message}`,
(err) => {
next(err);
});
});
//使用自定义错误处理
app.use((err, req, resp, next) => {
resp.json({
path: req.path,
message: err.message
});
});
app.listen(8080, () => {
console.log('listen on 8080');
});