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
相关产品推荐
相关产品推荐

