Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js中使用axios设置授权令牌_Javascript_Node.js_Axios - Fatal编程技术网

Javascript 如何在node.js中使用axios设置授权令牌

Javascript 如何在node.js中使用axios设置授权令牌,javascript,node.js,axios,Javascript,Node.js,Axios,我想在api测试中使用axios。要初始化客户端,我首先需要设置身份验证令牌,我也希望通过axios获得身份验证令牌。如何从异步代码中获得身份验证令牌 const a = require('axios'); getToken = () => { var axios =a.create({ baseURL: 'http://local.v2.app.com/api/auth/v1.0', headers: {'Content-Type': 'ap

我想在api测试中使用axios。要初始化客户端,我首先需要设置身份验证令牌,我也希望通过axios获得身份验证令牌。如何从异步代码中获得身份验证令牌

const a = require('axios');

  getToken = () => {
    var axios =a.create({
        baseURL: 'http://local.v2.app.com/api/auth/v1.0',
        headers: {'Content-Type': 'application/json'},
      });

      return axios.post('/credentials/login', {
        username: '1@test.com',
        password: 'Test@1234'
      })
      .then(function (response) {
        return response.data.data.token;
      })
      .catch(function (error) {
        console.log(error);
      });

  }

  const client=a.create({
    baseURL: 'http://local.v2.app.com/api/auth/v1.0',
    headers: {
        'Content-Type': 'application/json',
        'Authorization':  getToken()
},
  });

  module.exports = client; 

首先,getToken应该是异步的(或者只是返回承诺):

然后您可以模拟
请求

const client = a.create({
  baseURL: 'http://local.v2.app.com/api/auth/v1.0',
  headers: {
    'Content-Type': 'application/json'
  }
})
const request = client.request

const addToken = (token) => (data, headers) => {
  headers.Authorization = token
  return data
}

client.request = (config = {}) => new Promise(async (resolve, reject) => {
  token = await getToken()
  if (!config.transformRequest) config.transformRequest = []
  config.transformRequest.push(addToken(token))
  request(config).then(resolve, reject)
})

module.exports = client
是的,有点乱,请随意重构

axios具有
request
功能,该功能可发出请求,其他如get、post等都是别名。这段代码首先修补请求以获取令牌,然后继续请求

transformRequest取自github上的axious自述文件,其中有一条注释“您可以修改headers对象”,因此它是合法的


好问题,我不知道为什么-1

我理解正确吗,既然client.request是promise,我不能立即使用这个客户端,因为可能没有加载令牌?而且需要同步使用或尽管使用。那么,听起来真的很不方便。嘿,你打算使用.request或.get或.post不象承诺吗?在我的假设中,我的答案不应该改变进一步使用axios的通常方式。我希望像这样使用它
const client=require('./client');获取('/demo/search')
以及如何获得响应?我想我需要同步使用它等待
const client = a.create({
  baseURL: 'http://local.v2.app.com/api/auth/v1.0',
  headers: {
    'Content-Type': 'application/json'
  }
})
const request = client.request

const addToken = (token) => (data, headers) => {
  headers.Authorization = token
  return data
}

client.request = (config = {}) => new Promise(async (resolve, reject) => {
  token = await getToken()
  if (!config.transformRequest) config.transformRequest = []
  config.transformRequest.push(addToken(token))
  request(config).then(resolve, reject)
})

module.exports = client