如何在Node.js中从一个Azure Function获取返回值到另一个函数
问题分析
你遇到的核心问题是:request.get是基于回调的异步API,直接赋值给变量得到的是Request实例对象,而非API返回的响应结果。加上你的调用函数是async函数,但没有正确处理异步操作的等待,导致输出的是未完成的请求对象而非token。
解决方案
方案1:将request包装为Promise(兼容现有代码)
原生request不支持Promise,需要手动包装后配合async/await获取结果:
const request = require("request"); // 封装request.get为Promise function requestGet(url) { return new Promise((resolve, reject) => { request.get(url, (err, response, body) => { if (err) reject(err); // 检查响应状态码,确保请求成功 if (response.statusCode !== 200) { reject(new Error(`请求失败,状态码:${response.statusCode}`)); } resolve(body); }); }); } module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); try { const accessToken = await requestGet("http://localhost:7071/api/GetAuth"); console.log(accessToken); // 此处将拿到正确的token // 后续业务逻辑 context.res = { body: { accessToken } }; } catch (error) { context.log.error("获取token失败:", error); context.res = { status: 500, body: "获取访问令牌失败" }; } };
方案2:改用支持Promise的HTTP库(推荐)
request库已被官方弃用,建议换用axios或node-fetch,原生支持Promise,代码更简洁:
使用axios的示例:
先安装axios依赖:
npm install axios
调用函数代码:
const axios = require("axios"); module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); try { const response = await axios.get("http://localhost:7071/api/GetAuth"); const accessToken = response.data; console.log(accessToken); context.res = { body: { accessToken } }; } catch (error) { context.log.error("获取token失败:", error); context.res = { status: 500, body: "获取访问令牌失败" }; } };
额外优化:完善GetAuth函数的错误处理
你的GetAuth函数在出错时仅打印日志,没有返回错误响应,会导致调用方请求超时或拿到空响应。建议补充错误分支的响应输出:
const request = require("request"); module.exports = function GetAuth(context, req) { context.log('JavaScript HTTP trigger function processed a request.'); const url = "myurl.com"; const clientId = "****"; const clientSecret = "****"; const tenantId = "****"; const requestParams = { grant_type: "client_credentials", client_id: clientId, client_secret: clientSecret, resource: "https://graph.windows.net" }; request.post({ url: url, form: requestParams }, function (err, response, body) { if (err) { context.log.error("请求身份验证服务失败:", err); // 返回错误响应 context.res = { status: 500, body: "身份验证服务请求失败" }; context.done(); return; } let parsedBody; try { parsedBody = JSON.parse(body); } catch (parseErr) { context.log.error("响应解析失败:", parseErr); context.res = { status: 500, body: "身份验证响应解析失败" }; context.done(); return; } if (parsedBody.error_description) { context.log.error("身份验证错误:", parsedBody.error_description); context.res = { status: 401, body: parsedBody.error_description }; context.done(); return; } context.res = { body: parsedBody.access_token }; context.done(); }); };
内容的提问来源于stack exchange,提问作者stayfrosty
相关产品推荐
相关产品推荐

