Node.js基于oas3-tools使用OpenAPI3.0报请求实体过大错误
oas3-tools 触发
request entity too large 错误解决方案 问题根因
手动配置express.json({limit:'25mb'})或引入body-parser调整体积限制不生效,核心原因是oas3-tools 在调用expressAppConfig.getApp()方法时,会自动在内部挂载默认配置的body-parser解析中间件,默认请求体体积上限仅为100kb。如果自定义的body解析中间件在getApp()执行完成后才挂载,执行顺序会晚于oas3-tools内置的解析器,请求在到达自定义中间件之前就会被内置解析器抛出体积超限错误,配置自然不生效。
可行解决方案
方案1:通过oas3-tools官方配置覆盖内置解析器限制(推荐)
oas3-tools初始化时支持通过配置项透传参数给内置的body-parser,无需额外手动挂载解析中间件,直接修改初始化options即可:
var options = { routing: { controllers: path.join(__dirname, './controllers') }, logging: { format: 'combined', errorLimit: 400 }, // 新增以下配置覆盖默认body解析限制 middleware: { json: { limit: '25mb', // 可根据业务需求调整大小 strict: false }, urlencoded: { limit: '25mb', extended: true } } };
方案2:提前挂载自定义body解析中间件
如果方案1在你当前使用的2.1.3版本中不生效,可以在拿到app实例后第一时间挂载配置好体积限制的解析中间件,确保执行顺序早于oas3-tools内置的解析逻辑,修改代码如下:
var expressAppConfig = oas3Tools.expressAppConfig( path.join(__dirname, "./api/openapi.yaml"), options ); expressAppConfig.addValidator(); var app = expressAppConfig.getApp(); // 注意:拿到app实例后立刻挂载自定义解析器,必须放在所有其他app.use之前 app.use(express.json({limit: '25mb'})); app.use(express.urlencoded({limit: '25mb', extended: true})); // 如果涉及multipart/form-data格式请求(如文件上传),需在此处额外引入multer等解析中间件并配置对应limit // 后续再挂载其他业务中间件 app.use(cors()); var json2xls = require('json2xls'); app.use(json2xls.middleware);
提前挂载自定义解析器后,请求进入时会先被自定义解析器处理完成,后续oas3-tools内置解析器不会重复读取请求流,自然不会触发默认的体积限制校验。
注意事项
- Express 4.16+版本已内置
express.json()、express.urlencoded()解析方法,无需额外安装body-parser包 - 体积限制值请根据实际业务场景设置,避免配置过大导致服务被恶意大请求攻击
- 文件上传类
multipart/form-data请求无法被json/urlencoded解析器处理,需单独配置multer等对应中间件的体积限制
内容的提问来源于stack exchange,提问作者susindhiran
相关产品推荐
相关产品推荐

