refactor: 代码审查修复 — 错误边界、DRY抽取、测试修复、合规性改进
- P1: server.ts 统一错误边界 (withErrorHandler + AppError),修复 3 个失败/卡死测试 - P2: db 层 wrap/paginateQuery 抽取,前端 handleResponse 抽取,parseIdFromUrl 抽取 - P3: middleware 验证消息中文化,Flex→Space 替换 - P0: docs/development/README.md 新增已知设计决策章节 - P3-11 setup 拆分已尝试回退(@testing-library/react preload 依赖无法拆分) - P3-13 config 层测试从本次变更移除
This commit is contained in:
37
src/server/middleware/error-handler.ts
Normal file
37
src/server/middleware/error-handler.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import type { RuntimeMode } from "../../shared/api";
|
||||
import type { Logger } from "../logger";
|
||||
|
||||
import { createApiError, jsonResponse } from "../helpers";
|
||||
|
||||
type RouteHandler = (req: Request) => Promise<Response> | Response;
|
||||
|
||||
export class AppError extends Error {
|
||||
constructor(
|
||||
message: string,
|
||||
readonly statusCode: number,
|
||||
) {
|
||||
super(message);
|
||||
this.name = "AppError";
|
||||
}
|
||||
}
|
||||
|
||||
export function withErrorHandler(fn: RouteHandler, mode: RuntimeMode, logger?: Logger): RouteHandler {
|
||||
return async (req) => {
|
||||
try {
|
||||
return await fn(req);
|
||||
} catch (error: unknown) {
|
||||
if (error instanceof AppError) {
|
||||
return jsonResponse(createApiError(error.message, error.statusCode), {
|
||||
mode,
|
||||
status: error.statusCode,
|
||||
});
|
||||
}
|
||||
|
||||
logger?.error({ error }, "未处理的路由异常");
|
||||
return jsonResponse(createApiError("服务器内部错误", 500), {
|
||||
mode,
|
||||
status: 500,
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user