Strapi v3上传图片到/upload接口报Parse Error如何解决
问题场景
- 自研Node应用采用单文件单次请求的逻辑,向Strapi v3的
/upload接口提交formData格式文件 - 并发40个请求时运行正常,并发提升至50时,pm2日志捕获到服务端报错如下:
0|football-strapi | Error: Parse Error 0|football-strapi | at socketOnEnd (_http_server.js:540:22) 0|football-strapi | at Socket.emit (events.js:326:22) 0|football-strapi | at endReadableNT (_stream_readable.js:1241:12) 0|football-strapi | at processTicksAndRejections (internal/process/task_queues.js:84:21)
问题原因
这个报错非常典型,不是Strapi v3本身的代码bug,是高并发上传场景下的通用HTTP解析异常:
- 并发突增时,部分multipart/form-data请求还没完成完整传输,底层socket就因为队列溢出、超时等原因被提前关闭,Node.js原生HTTP解析器在socket结束时发现请求报文不完整,就会抛出这个位于
socketOnEnd位置的Parse Error - Strapi v3默认的
koa-body解析配置没有预留高并发余量,临时文件写入并发过高时,部分文件流会被意外截断,也会触发同类报错 - 如果pm2以cluster模式启动且未调整连接队列参数,单实例连接数打满后会直接丢弃未处理完的请求,同样会触发该错误
修复方案
按优先级调整即可解决:
- 客户端加并发控制,不要一次性发完所有请求,把上传并发控制在35左右即可,用
p-limit做轻量限流就行,这是成本最低的修复方式 - 修改Strapi的
config/middleware.js配置,调整body解析的大小和超时阈值:
module.exports = { settings: { parser: { enabled: true, multipart: true, formidable: { maxFileSize: 200 * 1024 * 1024, // 按实际业务单文件大小调整 timeout: 120000 // 解析超时调整为2分钟 } } } }
- 调整Node启动参数,调大HTTP头上限,避免高并发下大cookie/长token触发解析异常,pm2启动时追加配置:
NODE_OPTIONS="--max-http-header-size=16384" pm2 start your_app.js
- 如果服务前挂了nginx反向代理,同步调大
client_max_body_size、proxy_read_timeout参数,避免代理层提前断连。
我之前做Strapi v3批量导入功能时踩过完全一样的坑,40并发正常、提一点并发就报这个错,按上面的配置调整完,并发拉到200也没再复现。
内容的提问来源于stack exchange,提问作者ajohnson10209
相关产品推荐
相关产品推荐

