如何重新实现mapping_code以将自定义错误映射到HTTP状态码
解决方案
改用Map存储错误映射
普通JS对象的键只能是字符串或Symbol,无法直接用构造函数(Function类型)作为键,而Map支持任意类型的键,刚好适配你的需求。
// 定义错误构造函数与HTTP状态码的映射Map const mapping_code = new Map<Function, number>([ [CustomError1, HttpStatus.NOT_FOUND], [CustomError2, HttpStatus.BAD_REQUEST], // 可继续添加更多自定义错误与状态码的映射 ]);
修正ErrorHandler逻辑
通过error.constructor获取错误实例的构造函数,直接在Map中查找对应的状态码,同时处理未匹配到的默认情况:
export class ErrorHandler extends HttpException { constructor(error: Error, code?: number) { // 优先级:映射表匹配的状态码 > 传入的code > 默认500 const statusCode = mapping_code.get(error.constructor) ?? code ?? HttpStatus.INTERNAL_SERVER_ERROR; super(error.message, statusCode); } }
确保自定义错误的constructor正确
如果你的自定义错误是手动继承Error的,需要保证构造函数的指向正确(TypeScript编译后通常会自动处理,但手动写JS时要注意):
class CustomError1 extends Error { constructor(message: string) { super(message); // 可选:手动指定name,不影响constructor的判断,但便于日志排查 this.name = CustomError1.name; } }
扩展:处理错误继承场景
如果需要支持子类错误匹配父类的状态码(比如CustomSubError extends CustomError1),可以遍历Map查找第一个匹配error instanceof Constructor的项:
export class ErrorHandler extends HttpException { constructor(error: Error, code?: number) { let statusCode = code ?? HttpStatus.INTERNAL_SERVER_ERROR; // 遍历Map,找到第一个匹配的父类/自身构造函数 for (const [constructor, code] of mapping_code) { if (error instanceof constructor) { statusCode = code; break; } } super(error.message, statusCode); } }
内容的提问来源于stack exchange,提问作者pawcio
相关产品推荐
相关产品推荐

