Azure Function运行时Express urlencoded中间件无回调无报错挂起问题
核心原因
这个问题是Azure Functions HTTP触发器的默认行为导致的:
- Azure Functions 宿主在把请求转发给你的Express代码之前,会自动读取并消费完整的原始请求流,提前完成请求体的解析工作。传到Express层的请求流已经被读空,没有剩余数据可供body-parser读取。
urlencoded中间件匹配到对应Content-Type的请求后,会持续等待流数据传入,永远等不到数据就会一直挂起,既不会触发回调也不会抛出错误。- 本地运行时没有Azure Functions宿主的前置解析逻辑,请求流是完整可读的,所以运行完全正常。
- 你看到的
express.json中间件可以正常走完,是因为它检测到请求的Content-Type不是application/json,就直接跳过解析调用next(),不会尝试读取请求流。
可行的解决方法
- 方法1:关闭Azure Functions的自动请求体解析
在对应触发器的function.json配置中,给HTTP触发器的绑定项添加"dataType": "binary"配置,修改后宿主会保留原始请求流,直接传给你的代码,body-parser就可以正常工作:{ "type": "httpTrigger", "direction": "in", "name": "req", "dataType": "binary", "methods": ["get", "post"] } - 方法2:复用Azure预先解析好的请求体
针对urlencoded类型的请求,Azure宿主已经把解析完成的表单数据放到了req.body属性上,你可以加一层判断逻辑,在Azure运行环境下直接跳过urlencoded中间件:app.use((req, res, next) => { // 判断是否在Azure Functions环境运行 if (process.env.FUNCTIONS_WORKER_RUNTIME === 'node' && req.is('application/x-www-form-urlencoded')) { // 直接复用宿主解析好的body,跳过body-parser解析 return next(); } // 非Azure环境或者非urlencoded请求,走正常的urlencoded解析逻辑 bodyParser.urlencoded({ extended: true })(req, res, next); });
内容的提问来源于stack exchange,提问作者Drakinite
相关产品推荐
相关产品推荐

