You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS如何获取请求二进制body并解决PayloadTooLargeError报错

问题原因

  • 路由内额外注册的express.raw({type: '*/*'})中间件未配置limit参数,该中间件默认请求大小限制仅为100KB,上传稍大的二进制内容就会触发PayloadTooLargeError,且你已经在全局注册过带50MB限制的bodyParser.raw,这里属于重复注册的冗余逻辑。
  • express.raw中间件放在multer之前执行,会提前消费请求流,而multer专门用于解析multipart/form-data类型的二进制表单,无法读取已经被消费的流,也会导致解析异常。

修复方案

直接删掉路由中冗余的raw({type: '*/*'})中间件即可,全局注册的body-parser已经覆盖了非表单类型的请求解析,multer会专门处理带二进制文件的表单请求。

补充优化点:bodyParser.json、bodyParser.text、bodyParser.raw都不支持extended参数,只有urlencoded需要这个配置,你可以删掉多余参数避免无效配置。

修复后完整代码

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const multer  = require('multer');
const upload = multer({ dest: 'uploads/' })
const port = 3000;

// 全局解析中间件,已经覆盖所有非multipart/form-data的请求类型
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.text({limit: '50mb'}));
app.use(bodyParser.raw({limit: '50mb'}));
app.use(bodyParser.urlencoded({parameterLimit: 100000, limit: '50mb', extended: true}));

// 移除冗余的raw中间件,multer自动处理二进制表单
app.all('*', upload.array('files', 12), (req, res) => {
  console.log(req);
  res.json({
    method: req.method,
    path: req.originalUrl,
    query: req.query,
    headers: JSON.stringify(req.headers),
    body: {
      fields: req.body,
      files: req.files
    },
  });
});


app.listen(port,(err) => {
  if (err) {
    return console.log('something bad happened', err)
  }
  console.log(`server is listening on ${port}`)
});

如果你确实需要保留全局匹配的raw解析逻辑,只需给路由内的raw中间件加上limit配置即可,可根据实际请求大小调整阈值:

app.all('*',raw({type: '*/*', limit: '50mb'}), upload.array('files', 12), (req, res) => {
  // 业务逻辑
})

内容的提问来源于stack exchange,提问作者Gelloiss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:48:03