Node.js+Axios全局Token变量创建及接口传参问题
解决Node.js & Axios获取全局Token并传入请求头的问题
问题根源说明
Promise { <pending> }的含义:Axios发送请求是异步操作,返回的是Promise对象。当你直接打印这个对象时,请求还没完成,所以状态显示为pending——这只是表示异步任务还在进行中,尚未拿到最终结果。- 无法复用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
相关产品推荐
相关产品推荐

