You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:50:43