如何在 NuxtJS 中设置全局 $axios 标头

Posted

技术标签:

【中文标题】如何在 NuxtJS 中设置全局 $axios 标头【英文标题】:How to set global $axios header in NuxtJS 【发布时间】:2020-09-12 10:01:01 【问题描述】:

我已经尝试了两天了。我是 Nuxt 的新用户(尽管我已经使用 Vue 几年了),所以我只是想弄清楚这一切是如何工作的。

在我的 Nuxt 项目中,我安装了 Axios 模块:

nuxt.config.js

export default 
  plugins: [
    ...
    '~/plugins/axios',
  ],
  axios: 
    baseURL: 'https://my-url.com/wp-json/wp-v2',
    https: true,
  ,

plugins/axios.js

export default ( $axios, env ) => 
  $axios.onRequest(config => 
    $axios.setToken(env.WP_API_KEY, 'Bearer');
  );


在我的页面中,我正在尝试使用 asyncData 函数从我的 WordPress API 中提取数据,例如:

export default 
  async asyncData(context) 
    const data = await context.$axios.$get('/media');
    console.log(data);
    return  data ;
  

但是,我不断收到 401 Not Authorized 错误,基本上说明我的 Authorization: Bearer <token> 没有通过。但是,使用 Postman,我可以验证该端点确实可以工作并返回我需要的所有 JSON,因此问题必须出在我设置 axios 全局标头的方式上。

很难找到任何关于如何使用 Nuxt/Axios 模块设置全局标头的真实示例。我在docs 中看到了如何使用setToken,但是它并没有准确地显示将其放置在哪里。

我的设置有什么问题,我该如何解决?

【问题讨论】:

【参考方案1】:

很典型的是,我在发布问题 15 分钟后就可以正常工作。

这样设置标题似乎可行。我不确定为什么 setToken 方法不想工作。

export default ( $axios, env ) => 
  $axios.onRequest(config => 
    config.headers.common['Authorization'] = `Bearer $env.WP_API_KEY`;
  );

【讨论】:

【参考方案2】:

如果您使用的是 Nuxt 身份验证模块,这就是我的实现方式。

// nuxt.config.js
modules: [
 '@nuxtjs/auth',
 '@nuxtjs/axios',
],
auth: 
strategies: 
  local: 
    endpoints: 
      login:  url: '/auth/login', method: 'post', propertyName: 'accessToken' ,
      logout: false,
      user:  url: '/auth/me', method: 'get', propertyName: false 
    ,
  
,
redirect: 
  login: '/auth/signin',
  logout: '/auth/signin',
  callback: false,
  home: false,
,
cookie: false,
token: 
  prefix: 'token',
,
  plugins: ['~/plugins/auth.js'],
,



// plugins/axios.js
export default function ( $axios, $auth, redirect, store ) 
$axios.onRequest((config) => 
    config.headers = 
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': store.state.auth.tokenlocal, // refers to nuxt.config.js->auth.token
    
)

    $axios.onError((error) => 
        if (error.response.status === 500) 
            redirect('/error')
        
    )




// store/index.js
export const getters = 
    authenticated(state) 
        return state.loggedIn;
    ,
    user(state) 
        return state.user;
    
;

export const state = () => (
    busy: false,
    loggedIn: false,
    strategy: "local",
    user: false,
);

【讨论】:

以上是关于如何在 NuxtJS 中设置全局 $axios 标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在axios中设置全局标头?

在 Vue 3 中设置全局 Axios 标头

nuxtjs 环境中添加全局axios

如何在 Nuxt 配置中设置 .env 文件路径?

如何在反应中设置来自axios的响应状态

如何在axios中设置header和options?