实现思路
- 捕获错误:在 Express 应用中,使用
app.use((err, req, res, next) => {})
这种形式的中间件来捕获所有未处理的错误。
- 区分错误类型:通过自定义错误类或者在错误对象上添加标识属性来区分系统错误和业务逻辑错误。
- 返回合适响应:根据不同的错误类型,设置合适的 HTTP 状态码和错误信息返回给客户端。
关键代码示例
// 自定义业务逻辑错误类
class BusinessLogicError extends Error {
constructor(message) {
super(message);
this.name = 'BusinessLogicError';
}
}
// 错误处理中间件
app.use((err, req, res, next) => {
let statusCode = 500;
let errorMessage = 'Internal Server Error';
if (err instanceof BusinessLogicError) {
statusCode = 400;
errorMessage = err.message;
} else if (err.name === 'ValidationError') {
statusCode = 422;
errorMessage = err.message;
}
res.status(statusCode).json({
error: errorMessage
});
});