NestJS出现PayloadTooLargeError请求实体过大错误如何解决?
解决方案
根因分析
你遇到的request entity too large报错,是因为自定义的请求体大小限制配置没有生效,核心问题是中间件注册顺序错误:
NestJS 在执行app.init()方法时,就会自动注册内置的默认JSON、urlencoded解析中间件,默认请求体上限是100KB。你把自定义50MB限制的配置放在了app.init()之后,请求会优先触发默认的小容量解析器,直接抛出大小超限错误,后面加的自定义配置根本不会执行。
修复步骤
- 创建App实例时先关闭内置的自动bodyParser注册,避免和自定义配置冲突
- 将自定义的解析器配置挪到
app.init()调用之前
修改后的完整代码如下:
async function bootstrap() { // 关闭默认的bodyParser自动注册 const app = await NestFactory.create<NestExpressApplication>(AppModule, { bodyParser: false }); // 提前注册自定义大小限制的解析中间件 app.use(express.json({limit: "50mb"})) //For JSON requests app.use(express.urlencoded({ limit: "50mb", extended: false })); // app.enableCors({ // origin: '*', // }); const config = new DocumentBuilder() .setTitle('API client gateway') .setDescription('API client gateway full documentation') .setVersion('v0.0.1') .addTag('') .addBearerAuth( { type: 'http', scheme: 'bearer', bearerFormat: 'JWT', name: 'JWT', description: 'Enter JWT token', in: 'header', }, 'jwt-token', ) .build(); const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('/api/docs', app, document); await app.init(); await app.listen(AppConfig.Port); } bootstrap();
额外注意事项
- 若你的服务前端还有Nginx、SLB等反向代理服务,需要同步调整代理层的请求体大小限制,比如Nginx要配置
client_max_body_size 50m;,否则请求会在代理层直接被拦截。 - base64编码会比原始二进制体积大33%左右,你的2MB base64请求体实际对应原始文件约1.5MB,配置50MB的上限完全可以覆盖需求。
内容的提问来源于stack exchange,提问作者wildegor
相关产品推荐
相关产品推荐

