Node.js生产环境全局错误处理CastError未返回预期400响应问题
问题核心原因
- 生产环境分支中,你完成CastError判断和AppError转换的是新生成的
error变量,但最终调用sendErrorProd时传入的仍然是未做任何处理的原始err对象,转换逻辑完全没有生效。 - 使用
{...err}扩展Error实例时,只会复制实例自身挂载的属性,无法拿到Error原型链上的内置属性name、message,因此error.name === 'CastError'的判断条件永远为假,不会进入错误转换逻辑。
修复方案
直接修改全局错误处理中间件的生产环境分支代码即可:
else if(process.env.NODE_ENV === 'production'){ // 复制错误时手动挂载内置的name、message属性 let error = {...err, name: err.name, message: err.message}; if(error.name === 'CastError') error = handleCastErrorDB(error); // 传入处理后的error对象,而非原始err sendErrorProd(error, res) }
修改后生产环境就能正确识别CastError,转换为标记isOperational=true的AppError实例,返回预期的400状态码和错误提示。
内容的提问来源于stack exchange,提问作者Adil Nehal
相关产品推荐
相关产品推荐

