2.3 KiB
2.3 KiB
kind, name, category, scope, source_files
| kind | name | category | scope | source_files | |||||
|---|---|---|---|---|---|---|---|---|---|
| error_handling | 前后端统一错误响应与拦截机制 | error_handling |
|
|
本仓库采用「后端统一响应体 + 前端 Axios 拦截器」的轻量级错误处理方案,未引入专门的错误类型库或全局异常中间件。
后端(Express)
- 统一响应封装:
backend/src/utils/response.js提供ApiResponse.success / error / noData三个工厂方法,约定code=1成功、code=0业务错误、code=2无数据;PageData用于分页结构。 - 路由层自行 try/catch:各
routes/*.js在控制器内捕获异常,记录logger.error(e.message)后返回ApiResponse.error(...),错误消息多为硬编码中文提示,未使用 HTTP 状态码区分语义。 - 认证中间件
middleware/auth.js单独处理鉴权错误:401 返回{ detail: '...' },403 返回权限不足信息,与业务错误体结构不同。 - 服务层
services/*.js直接throw new Error(...)向上抛出具体错误(如 Redis/S3/曲线接口失败),由调用方路由捕获。 - 应用入口
app.js仅在启动阶段同步数据库时 try/catch,未注册全局 Express 错误处理中间件(app.use((err, req, res, next) => ...))。
前端(Vue3 + Axios)
frontend/src/utils/request.js通过 Axios 拦截器集中处理:- 请求拦截:自动注入
Authorization: Bearer <token>,跳过/auth/login。 - 响应拦截:当
res.code === 0时,若config.skipErrorToast未设置则弹出ElMessage.error,并将responseData挂载到抛出的 Error 对象上供上层消费。 - HTTP 错误:401 清除本地 token、跳转登录页并携带 redirect;403 显示警告;其他网络错误统一
ElMessage.error。
- 请求拦截:自动注入
- 业务 API 模块(
frontend/src/api/*.js)基于此 request 实例发起请求,依赖 Promise reject 分支处理业务错误。
设计决策与不足
- 优点:前后端对
code/msg/data协议一致,前端拦截器屏蔽了重复的错误提示逻辑。 - 不足:缺少统一的错误码枚举、HTTP 状态码未与业务错误解耦、未定义全局错误中间件导致未捕获异常可能返回默认 HTML 500 页面。