使用express-formidable处理multipart数据时普通POST请求无限挂起问题
问题原因
你将express-formidable注册为全局中间件,它会拦截所有POST请求尝试解析表单数据流。而普通application/json、application/x-www-form-urlencoded类型的请求体已经被前面的express.json()、express.urlencoded()中间件消费,formidable无法获取完整的请求数据流就会一直等待,最终导致请求无限挂起。
另外你提供的app.js中重复声明了const app = express(),属于冗余代码,建议删除重复声明。
解决方案
方案1:路由级挂载formidable中间件(推荐)
不要全局注册formidable,只在需要处理multipart/form-data的上传路由上单独挂载:
- 删除app.js中全局注册的
app.use(formidableMiddleware());代码 - 在上传图片的路由定义处单独引入中间件,示例:
// 仅上传路由使用formidable app.post('/upload/profile-pic', formidableMiddleware(), uploadProfilePic) // 其他普通路由正常定义,不需要加formidable app.post('/user/update', updateUserData)
该方案完全避免中间件冲突,性能最优。
方案2:配置formidable仅处理form-data类型请求
如果你需要保留全局注册的写法,可以添加配置限制formidable仅处理multipart类型的请求:
// 修改app.js中的全局注册代码 app.use(formidableMiddleware({ parseOnly: ['multipart/form-data'] }));
配置后formidable遇到非form-data类型的请求会直接跳过解析,交给后续中间件处理,不会出现挂起问题。
内容的提问来源于stack exchange,提问作者Anurag Raghuvanshi
相关产品推荐
相关产品推荐

