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

Node.js+Axios全局Token变量创建及接口传参问题

解决Node.js & Axios获取全局Token并传入请求头的问题

问题根源说明

  1. Promise { <pending> }的含义:Axios发送请求是异步操作,返回的是Promise对象。当你直接打印这个对象时,请求还没完成,所以状态显示为pending——这只是表示异步任务还在进行中,尚未拿到最终结果。
  2. 无法复用Token的原因:你直接把Promise对象赋值给了token变量,而非将请求返回的Token字符串存入变量,自然没法直接用在请求头里。

修复步骤

1. 封装Token获取逻辑,存储全局可用的Token值

定义全局变量存储Token,用async/await封装获取Token的函数,确保拿到实际的Token字符串:

const axios = require('axios');
const express = require('express');
const app = express();

// 全局变量存储Token
let globalToken;

// 获取Token的配置(沿用你原有的配置)
const tokenData = '<tsRequest>\r\n\t<credentials name="name" password="pword">\r\n\t\t<site contentUrl="" />\r\n\t</credentials>\r\n</tsRequest>';
const tokenConfig = {
  method: 'post',
  url: 'https://url.uni.edu/api/3.13/auth/signin',
  headers: { 
    'Content-Type': 'text/plain'
  },
  data: tokenData
};

// 封装获取Token的异步函数
async function getToken() {
  try {
    const response = await axios(tokenConfig);
    globalToken = response.data.credentials.token;
    console.log('Token已更新:', globalToken);
  } catch (error) {
    console.error('获取Token失败:', error);
    // 可根据需求添加重试逻辑或抛出错误
    throw error;
  }
}

// 服务器启动时先获取一次Token
getToken();

2. 在app.get请求中使用全局Token

修改/gql接口,确保使用实际的Token字符串,同时处理Token未就绪的情况:

app.get('/gql', async (req, res) => {
  // 如果Token还没获取到,先等待获取完成
  if (!globalToken) {
    try {
      await getToken();
    } catch (error) {
      return res.status(500).send('初始化Token失败');
    }
  }

  const gqlRequestConfig = {
    method: 'POST',
    url: 'https://diffurl.uni.edu/api/metadata/graphql',
    headers: {
      'X-Some-Auth': globalToken, // 传入全局存储的Token字符串
      'Content-Type': 'application/json'
    },
    // 补充你的GraphQL请求数据,比如data: {...}
  };

  try {
    const gqlResponse = await axios(gqlRequestConfig);
    res.send(gqlResponse.data);
  } catch (error) {
    console.error('GraphQL请求失败:', error);
    res.status(500).send('请求处理失败');
  }
});

// 启动服务器
app.listen(3000, () => {
  console.log('服务器运行在3000端口');
});

额外建议

  • 如果Token有过期时间,可在每次请求前检查Token有效性,或设置定时任务自动刷新Token。
  • 避免将敏感信息(如用户名、密码)硬编码,建议用环境变量存储,比如process.env.USER_NAME。

内容的提问来源于stack exchange,提问作者Redink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:15:55