- 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 层测试从本次变更移除
38 lines
973 B
TypeScript
38 lines
973 B
TypeScript
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,
|
|
});
|
|
}
|
|
};
|
|
}
|