自定义Error Handler无法生效,默认错误处理器触发问题求助
结合你提供的代码,以下是可能导致自定义错误处理器失效的核心原因:
重复定义ErrorHandler类
错误处理文件中,先通过const ErrorHandler = require("../utils/errorhandler")引入了外部的ErrorHandler类,随后又在同一文件内重新定义了class ErrorHandler。这会导致外部引入的类被覆盖,当业务代码抛出错误时,实际使用的可能不是期望的自定义错误类,进而导致中间件无法识别并处理这类错误,最终触发默认处理器。错误对象解构丢失关键属性
在生产环境处理逻辑中,你使用let error = {...err}复制错误对象,但Error实例的很多属性(比如自定义的statuscode、stack)属于不可枚举属性,解构赋值无法复制这些属性。这会导致error.statuscode变为undefined,后续响应状态码不符合预期,甚至因错误对象结构异常,使得自定义中间件逻辑失效。CatchAsyncErrors中间件未正确传递异步错误
控制器中使用CatchAsyncErrors包裹异步函数,但未提供该中间件的实现代码。如果这个中间件没有正确捕获异步函数中的错误,并通过next(err)将错误传递给自定义错误中间件,而是直接抛出错误,Express会触发默认的错误处理器,而非你的自定义逻辑。环境变量拼写错误
代码中判断开发环境的条件是process.env.NODE_ENV === "DEVELOPEMENT",这里存在拼写错误(正确应为DEVELOPMENT)。如果实际运行环境是development,这个判断会不成立,导致无法进入开发环境的错误处理分支;若生产环境判断也未命中,自定义中间件将无法返回预期响应,最终触发默认处理器。错误中间件注册顺序错误
Express要求错误处理中间件(带有err, req, res, next四个参数的中间件)必须是最后注册的中间件。如果你的自定义错误中间件注册在路由、静态资源中间件或其他业务中间件之前,Express将不会把错误传递给它,而是使用默认错误处理器。
内容的提问来源于stack exchange,提问作者Sanyam Kapoor

