Axios FormData传大字符串至Node.js时bodyparser截断问题排查
大体积FormData字段截断问题排查与解决
问题场景
浏览器端通过Axios结合FormData向Node.js服务器发送请求,元数据以JSON字符串形式放在FormData的普通字段中;服务器使用body-parser配合express-fileupload处理请求,其中body-parser的json和urlencoded均设置了100MB的大小限制;Nginx反向代理已设置client_max_body_size=500M。
当JSON字符串小于1MB时请求正常,超过1MB后服务器接收的元数据被截断,执行JSON.parse时抛出Unexpected end of JSON input错误。
客户端代码示例
let fd = new FormData() fd.append('uid', 1); fd.append('meta', "json string here"); axios({ url: 'http://localhost:9090/receivemeta', method: 'POST', data: fd }).then(resp => { console.log(resp.data); }).catch(error => { console.error(error.response.data) });
服务端代码示例
app.post('/receivemeta', async (req, res) => { try { let meta = JSON.parse(req.body.meta); fs.writeJSONSync('/tmp/meta.json', meta, 'utf-8'); res.json({ success: true }) } catch (error) { res.json({ success: false, error: error }); } })
问题根源
不是body-parser导致的问题。原因在于:
body-parser的json和urlencoded配置仅针对application/json、application/x-www-form-urlencoded类型的请求生效,对multipart/form-data类型的请求不处理;- 实际处理
multipart/form-data的是express-fileupload,它默认对FormData中的**普通字段(非文件)**设置了fieldSize=1MB的限制,当字段内容超过这个值时会被自动截断,进而导致JSON解析失败。
解决方案
在初始化express-fileupload时,显式配置limits.fieldSize为更大的值(比如100MB),覆盖默认限制:
const fileUpload = require('express-fileupload'); // 配置express-fileupload,调整普通字段大小限制 app.use(fileUpload({ limits: { fieldSize: 100 * 1024 * 1024 // 设置为100MB } })); // 原有路由逻辑保持不变 app.post('/receivemeta', async (req, res) => { try { let meta = JSON.parse(req.body.meta); fs.writeJSONSync('/tmp/meta.json', meta, 'utf-8'); res.json({ success: true }) } catch (error) { res.json({ success: false, error: error.message }); } })
额外注意事项
- 确保
express-fileupload的配置代码放在路由注册之前,保证中间件先生效; - 若后续涉及文件上传,可同时调整
limits.fileSize参数控制文件大小。
内容的提问来源于stack exchange,提问作者Kaushal
相关产品推荐
相关产品推荐

