NodeJS开发Azure Function生成Token无法返回响应体问题求助
问题根因
你的代码问题在于Azure Function入口函数声明为async,但你使用的request库是基于回调的异步实现,函数不会等待回调执行完成就提前结束了,context.res的赋值操作发生在函数已经返回响应之后,因此返回的响应体为空。
修复方案
方案1:搭配context.done()使用回调模式,移除async声明
// 去掉async声明,适配回调处理逻辑 module.exports = function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); var request = require('request'); var options = { 'method': 'POST', 'url': 'https://abc.onbmc.com/api/jwt/login', 'headers': { 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'keep-alive' }, form: { 'username': 'abc@xyz.com', 'password': 'password123' } }; request(options, function (error, response) { if (error) { context.res = { status: 500, body: error.message }; return context.done(); } context.res = { body: response.body }; // 处理完成后调用done通知Azure Function可以返回响应 context.done(); }) }
方案2:将请求Promise化,搭配async/await使用
推荐使用这种方案,代码可读性更高,适配当前async声明:
首先安装支持Promise的请求依赖:npm install request-promise
修改后的代码:
const rp = require('request-promise'); module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); var options = { 'method': 'POST', 'url': 'https://abc.onbmc.com/api/jwt/login', 'headers': { 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'keep-alive' }, form: { 'username': 'abc@xyz.com', 'password': 'password123' }, resolveWithFullResponse: true }; try { const response = await rp(options); context.res = { body: response.body }; } catch (error) { context.res = { status: 500, body: error.message }; } }
额外注意事项
- 生产环境不要将账号密码硬编码在代码中,建议通过Azure Function的应用配置存储敏感信息,调用时通过
process.env.配置项名读取即可。 request库已经停止官方维护,长期使用建议替换为axios或者Node.js原生fetchAPI。
内容的提问来源于stack exchange,提问作者Abdulquadir Shaikh
相关产品推荐
相关产品推荐

