3.5 KiB
3.5 KiB
kind, name, category, scope, source_files
| kind | name | category | scope | source_files | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| error_handling | 前后端统一错误码与响应封装 | error_handling |
|
|
后端(Node.js + Express)
- 统一响应体:
backend/src/utils/response.js导出ApiResponse,提供success(data, msg)、error(msg, code=0)、noData(msg)三个工厂方法,所有业务路由通过res.json(ApiResponse.xxx(...))返回{ code, msg, data }结构。 - 认证错误:
backend/src/middleware/auth.js的authMiddleware对未登录/无效/过期 JWT 直接以 HTTP 401 +{ detail: '...' }形式返回;requireSuperAdmin对权限不足返回 403。这些 401/403 走的是 HTTP 状态码路径,不走 ApiResponse。 - 异常捕获:各路由文件内大量使用
try/catch包裹异步逻辑,失败时调用ApiResponse.error(...);入口app.js仅在启动阶段同步数据库时 catch 并记录日志,未注册全局expresserror handler,因此未捕获的异常会以 Node 默认方式抛出。 - 无全局错误中间件:未发现类似
app.use((err, req, res, next) => ...)的全局错误处理中间件,错误传播依赖每个路由自行 try/catch 后返回 ApiResponse。
前端(Vue3 + Axios)
- 请求封装:
frontend/src/service/request/index.ts基于@sa/axios的createFlatRequest创建request实例,集中处理成功/失败分支。 - 成功判定:
isDashboardSuccessCode将后端code === '1'或'2'视为成功(2 表示“无数据但仍 OK”),其余进入onBackendFail。 - 后端失败处理:
- 根据环境变量
VITE_SERVICE_LOGOUT_CODES/VITE_SERVICE_MODAL_LOGOUT_CODES/VITE_SERVICE_EXPIRED_TOKEN_CODES分别执行静默登出、弹窗确认登出、刷新 token 并重试。 - 通过
showErrorMsg(定义于shared.ts)统一弹出错误提示,支持skipErrorToast配置由调用方抑制 toast。
- 根据环境变量
- HTTP 错误处理:
onError中针对 401 自动清理 auth store 并显示 detail;403 显示“无权限执行此操作”;其他错误优先取response.data.msg,否则回退到 axios message。 - demo 请求:
demoRequest使用独立的 success/fail 策略,不干扰主请求的错误流。
约定与规则
| 层面 | 约定 |
|---|---|
| 后端成功 | ApiResponse.success(data, msg) → { code: 1, msg, data } |
| 后端业务错误 | ApiResponse.error(msg, code) → { code, msg, data: null },code 为数字字符串(如 0) |
| 后端空数据 | ApiResponse.noData(msg) → { code: 2, msg, data: null },前端视作成功 |
| 认证失败 | 401 + { detail: '...' }(JWT 相关) |
| 权限不足 | 403 + { detail: '...' } |
| 前端成功判定 | `code === '1' |
| 前端错误展示 | 统一经 showErrorMsg,可通过 config.skipErrorToast = true 抑制 |
| 全局错误中间件 | 后端未实现,需在各路由 try/catch 后返回 ApiResponse |
关键文件
backend/src/utils/response.js— 统一响应体工厂backend/src/middleware/auth.js— 认证/鉴权错误(401/403)backend/src/app.js— 应用入口(仅启动期 try/catch)frontend/src/service/request/index.ts— Axios 拦截器与错误分发frontend/src/service/request/shared.ts—showErrorMsg等共享工具