使用Node&Axios

What I Want to Do

在我的server.js文件中,我希望为总是更改的令牌调用API,使用axios(或其他解决方案)创建一个全局令牌变量,并将全局令牌提供给对象中的app.get请求头,所有这些都在我的server.js文件中.

What I'm Trying

我用……来获取数据.

var data = '<tsRequest>\r\n\t<credentials name="name" password="pword">\r\n\t\t<site contentUrl="" />\r\n\t</credentials>\r\n</tsRequest>';

var config = {
  method: 'post',
  url: 'https://url.uni.edu/api/3.13/auth/signin',
  headers: { 
    'Content-Type': 'text/plain'
  },
  data : data
};

我try 创建全局令牌变量(这就是我正在努力的地方)……

const token= axios(config)
.then((response) => {
  console.log(response.data.credentials.token);
}).catch((err) => {
  console.log(err);
});

console.log(token)

我有一个正在运行的app.get请求,其中我希望使用const token...

app.get('/gql', async (req, res) => {
    var someObject = {
      'method': 'POST',
      'url': 'https://diffurl.uni.edu/api/metadata/graphql',
      'headers': {
        'X-Some-Auth': token,
        'Content-Type': 'application/json'
      },

The Current Results

我所拥有的var data =var config =axios(config)都可以通过console.log返回令牌,但是我在使用axios时遇到了两个问题.

The Axios Issues

  1. 在我希望创建一个全局令牌变量时,我只知道如何获得console.log的结果,而不是返回一个"有用的数据对象". 在几乎每一篇文档或找到的帮助中,该示例都使用了console.log,对于学习者来说,这并不是一个实际的示例,而不仅仅是在他们的控制台中返回数据. 我需要在AXIOS中提供什么才能创建一个全局令牌对象,而不是sole.log呢?

  2. 我意识到1.是我当前的拦截器,但如果我运行我的应用程序,我会得到以下结果:

Promise { <pending> }
Express server running on port 1234
abc123 [the console.logged token via axios]

我不确定Promise { <pending> }是什么意思,我该怎么解决呢?

Beyond The Axios Issues

如果AXIOS问题被修复,我是否正确地将const token传入我的app.get... var someObject... headers

感谢您所能提供的任何帮助.

推荐答案

这就是Axios interceptors美元的用处.

您可以使用拦截器创建一个Axios实例,该拦截器在将令牌添加到传出请求之前等待令牌请求完成.

可以添加响应拦截器来处理401个状态并触发令牌续订.

const data = "<tsRequest>...</tsRequest>";

let renew = true;
let getTokenPromise;

const renewToken = () => {
  if (renew) {
    renew = false; // prevent multiple renewal requests
    getTokenPromise = axios
      .post("https://url.uni.edu/api/3.13/auth/signin", data, {
        headers: {
          "content-type": "text/plain", // are you sure it's not text/xml?
        },
      })
      .then((res) => res.data.credentials.token);
  }
  return getTokenPromise;
};

const client = axios.create();

// Request interceptor to add token
client.interceptors.request.use(async (config) => ({
  ...config,
  headers: {
    "X-Some-Auth": await renewToken(),
    ...config.headers,
  },
}));

// Response interceptor to handle expiry
client.interceptors.response.use(
  (res) => res,
  (error) => {
    if (error.response?.status === 401) {
      // Auth expired, renew and try again
      renew = true;
      return client(error.config);
    }
    return Promise.reject(error);
  }
);

// if putting this in a module...
// export default client;

当您第一次try 发出请求时,将检索令牌.在此之后,它将继续使用最后一个值,直到它过期.

Node.js相关问答推荐

node 模块错误:类型参数OT具有循环约束''

如何使用jq将依赖项添加到package.json中

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

如何从基于JSON的HTML/SCSS模板生成PDF?

即使卷已设置,Docker Nodemon 也不会热重载

dayjs的isSameOrAfter方法未按预期工作

如何在 Firestore 函数上使用类型模型来获取字段值

mongoose findOneAndUpdate 不更新数据库

每个数组值在 mongodb 中查找一个文档

ResponseError:键空间ks1不存在

node Axios 创建全局令牌变量以在单独的变量头中使用

错误:无法检测到网络(event="noNetwork",code=NETWORK_ERROR,version=providers/5.6.8)

Cypress net::ERR_EMPTY_RESPONSE 在真实服务器调用上

与 NPM 一起安装时找不到 Express 模块

从 Node.js 应用程序查询 Heroku 托管的 Postgres 数据库时出现自签名证书错误

从目录 node Js 中检索文件

Node.js, require.main === 模块

当我try 向我的 S3 存储桶 (Node.js) 发送内容时,AWS 缺少凭证

expressjs app.VERB 调用中的 next() 和 next('route') 有什么区别?

将 expressjs 绑定到特定的 IP 地址