- 建立 pnpm workspace + Turborepo 单仓、ESLint 9/Prettier/commitlint/husky 门禁 - NestJS + Fastify API:统一错误体、trace_id、Zod 管道、/health 真实依赖探活、OpenAPI 3.1 契约 - Prisma 基线:outbox_events/idempotency_keys/system_configs 与首版迁移、幂等种子 - shared 契约包:错误码、权限点、ULID、游标分页、命名/时间工具 - ui 包与 Web 壳层:Semi + Remix 图标统一出口、Cloud Blue 视觉、登录/工作台/错误页 - worker 骨架、Playwright 冒烟、Gitea CI、OpenAPI 快照与 oasdiff 回退脚本 - 补充 A0 实施报告与本地开发说明
This commit is contained in:
1 parent
9c3ab9768a
commit
04f49690f4
155 files changed
+18402
-28
No files matched your search
@@ -0,0 +1,32 @@
|
||||
import type { ApiErrorBody } from '../schemas/api.js';
|
||||
import { ERROR_MESSAGES, type ErrorCode } from './codes.js';
|
||||
|
||||
/**
|
||||
* 前后端共用的 API 错误对象。
|
||||
* - 服务端:AllExceptionsFilter 用它把异常序列化成统一错误体;
|
||||
* - 前端:请求层把错误体还原成 ApiError,保留 trace_id 便于用户报障。
|
||||
*/
|
||||
export class ApiError extends Error {
|
||||
readonly code: ErrorCode;
|
||||
readonly status: number;
|
||||
readonly details?: unknown;
|
||||
readonly traceId: string;
|
||||
|
||||
constructor(params: { code: ErrorCode; message?: string; details?: unknown; traceId?: string }) {
|
||||
super(params.message ?? ERROR_MESSAGES[params.code]);
|
||||
this.name = 'ApiError';
|
||||
this.code = params.code;
|
||||
this.status = Math.floor(params.code / 100);
|
||||
this.details = params.details;
|
||||
this.traceId = params.traceId ?? '';
|
||||
}
|
||||
|
||||
toBody(): ApiErrorBody {
|
||||
return {
|
||||
code: this.code,
|
||||
message: this.message,
|
||||
...(this.details === undefined ? {} : { details: this.details }),
|
||||
trace_id: this.traceId,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user