const express = require('express');
const app = express();
// 自定义错误处理中间件
app.use((err, req, res, next) => {
let statusCode = 500;
let errorMessage = 'Internal Server Error';
if (err.name === 'ValidationError') {
statusCode = 400;
errorMessage = 'Parameter validation error';
} else if (err.code === 'ECONNREFUSED') {
statusCode = 503;
errorMessage = 'Database connection error';
}
res.status(statusCode).json({ error: errorMessage });
});
// 将错误处理中间件放在所有路由和其他中间件之后
// 示例路由
app.get('/', (req, res) => {
throw new Error('模拟错误');
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
中间件集成解释
- 位置:错误处理中间件必须放在所有路由处理程序和其他中间件之后。这是因为Express的中间件执行是线性的,只有当前面的中间件或路由处理程序抛出错误时,才会触发错误处理中间件。
- 错误传递:在业务逻辑中,当发生错误时,使用
throw
语句抛出错误。Express会捕获这些错误并将其传递给错误处理中间件。错误处理中间件的函数签名必须是(err, req, res, next)
,其中err
是抛出的错误对象,req
和res
分别是请求和响应对象,next
是Express的中间件控制函数(在错误处理中间件中通常不需要使用)。通过在中间件内部对err
进行判断,区分不同类型的错误,设置合适的HTTP状态码和错误信息,最后通过res.status(statusCode).json({ error: errorMessage })
返回给客户端。