如何增大Express应用的请求文件大小限制?
解决Express大文件上传PayloadTooLargeError及无法获取file字段的问题
咱们先把问题根源理清楚:
- 你碰到的
PayloadTooLargeError,本质是Express默认对请求体大小有限制,但**bodyParser.json()和bodyParser.urlencoded()只负责处理JSON、URL编码类型的请求体,完全管不了文件上传用的multipart/form-data格式**。所以你之前加的那两行配置不仅没解决大文件问题,反而干扰了文件上传的解析逻辑,导致后端拿不到file字段。 - 额外出现的localhost:9000认证要求,大概率是错误的解析配置打乱了请求处理流程,让中间件或代理逻辑出现了异常。
正确的解决步骤:
1. 用multer处理文件上传(Express官方推荐的multipart解析工具)
multer是专门用来处理multipart/form-data类型请求的工具,既能设置文件大小限制,还能帮你正确解析出文件字段。
先安装multer:
npm install multer --save
2. 在你的Express应用中配置multer
根据你的代码结构,重点要在处理文件上传的后端服务(也就是端口9001的app_backend)里配置:
var multer = require('multer'); // 设置文件大小限制为50MB,单位支持bytes、KB、MB,这里50*1024*1024就是50MB var upload = multer({ limits: { fileSize: 50 * 1024 * 1024 } }); // 在需要处理文件上传的路由前挂载这个中间件 // 比如你的status路由负责处理上传,就改成下面这样: app_backend.use('/', upload.any(), status); // 如果是特定路由(比如/upload)处理上传,就写: // app_backend.post('/upload', upload.single('file'), yourUploadHandler);
3. 移除之前错误的bodyParser配置
把你之前加的这两行代码删掉:
app.use(bodyParser.json({limit: '50mb'})); app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
这两个中间件不处理multipart请求,留着只会让请求体解析异常,导致后端拿不到file字段。
4. 验证效果
重启Express服务后,再上传超过1MB的文件,应该就不会再触发PayloadTooLargeError,同时后端也能正常获取到file字段了。
额外提醒:
如果你的文件上传请求是通过主app(端口9000)的代理转发到后端,还要确保被代理的目标服务也配置了对应的文件大小限制,否则代理环节也可能报错。
内容的提问来源于stack exchange,提问作者TheHorizon




