集成Socket.io后Multer上传大于50KB文件无响应、文件被裁剪问题
问题原因
集成Socket.io后出现Multer异常的核心原因是请求原始流被提前消费:Multer依赖未被读取的原始req流处理文件上传,小于50KB的文件会被存入默认内存缓冲区可被完整读取,大于50KB的文件流被其他中间件截断消费,导致Multer无法接收到完整流,出现文件截断、回调不触发、请求挂起的问题。
解决方案
- 调整中间件加载顺序
禁止全局挂载express.json()、express.urlencoded()、body-parser等解析请求体的中间件,将这类中间件仅挂载到不需要文件上传的路由上,确保文件上传路由的req流在到达Multer前未被消费。 - 排查Socket.io关联配置
确认Socket.io挂载到HTTP服务时未开启额外的请求体解析配置,不要在Socket.io的中间件中读取req的流数据。如果使用了CORS中间件,确保预检请求(OPTIONS)被正确响应,不会阻塞上传请求的流传输。 - 修复代码潜在隐患
当前文件名后缀获取逻辑存在风险,当文件名包含多个.时会得到错误后缀,建议修改为:const ext = path.extname(file.originalname).slice(1) - 检查其他前置中间件
排查所有在上传路由前执行的中间件(如请求日志、权限校验中间件),确认没有逻辑监听req的data/end事件提前消费请求流。
内容的提问来源于stack exchange,提问作者acrossmindanduniverse
相关产品推荐
相关产品推荐

