BodyParser中间件错误无法传递至NestJS拦截器的问题
解决NestJS中Express BodyParser错误不经过拦截器的问题
问题原因
NestJS拦截器仅作用于Nest路由处理流程内部(路由处理器、守卫、管道等抛出的错误),它通过next.handle()的Observable流捕获错误。而你手动添加的Express json()中间件是在Nest路由匹配逻辑之前执行的,抛出的PayloadTooLargeError直接进入Express原生错误处理链,并未进入Nest拦截器监听的Observable流,因此不会被拦截器处理。
解决方案:改用Nest内置的BodyParser配置
Nest已默认集成BodyParser,无需手动添加Express原生中间件,通过Nest提供的API配置参数即可让BodyParser错误进入Nest处理流程,被拦截器捕获。
- 移除手动添加的中间件
删除bootstrap方法中的以下代码:
nestApp.use('*', json({ limit: '256kb' }))
- 用Nest的API配置BodyParser
在bootstrap中替换为:
nestApp.useJsonBodyParser({ limit: '256kb' });
配置完成后,BodyParser的限制逻辑会纳入Nest处理流程,请求体过大时抛出的错误会先经过ErrorInterceptor转换,再传递给全局ErrorFilter处理。
补充说明
若因特殊需求必须保留手动Express中间件,需将其包装为异步形式并确保错误传递至next(),但这需要为中间件添加额外错误处理逻辑,不符合你“避免自定义中间件错误处理”的需求,因此优先推荐使用Nest内置配置方式。
内容的提问来源于stack exchange,提问作者Guy Grin
相关产品推荐
相关产品推荐

