vue(nuxt同理)项目中配置axios全局统一拦截器

本文介绍如何在项目中封装axios库,实现统一的请求和响应拦截,包括环境变量配置、请求路径检查、自动携带token、状态码判断及错误信息提示。同时展示了创建接口文件和组件内调用封装接口的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:新建util文件夹,并且新建axios.js文件如下图:

在这里插入图片描述

import axios from 'axios'
import {Message, MessageBox, Notification} from 'element-ui'

const service = axios.create({
  baseURL: `http://${process.env.BASE_URL || 'localhost'}:${process.env.PORT || 3001}`,
  timeout: 10000,
  headers: {}
});

// request interceptor
service.interceptors.request.use(config => {
  // Do something before request is sent
  if (config.url == undefined) {
    Notification({
      title: '警告',
      message: '请求路径错误,请检查!',
      type: 'warning',
      offset: 100,
      duration: 2000
    });
    return false
  }
  // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
  //config.headers['X_Innovate_Session'] = getToken() 
  // config.headers['X_Token'] = getToken()
  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

// respone interceptor
service.interceptors.response.use(
  // response => response,
  /**
   * 下面的注释为通过在response里,自定义code来标示请求状态
   * 当code返回如下情况则说明权限有问题,登出并返回到登录页
   * 如想通过xmlhttprequest来状态码标识 逻辑可写在下面error中
   * 以下代码均为样例,请结合自生需求加以修改,若不需要,则可删除
   */
  response => {
    const res = response.data
    if (response.status == 200 && res.code === '0000') {
      return res
    } else {
      if (res.code === '401') {
        Message.warning('登录过期,请重新登录!')

      } else {
        Message.error(res.msg)
      }
      // return Promise.reject('error')
    }
  },
  /**
  *	错误回调
  *	*/
 
  error => {
    console.error('err:' + error) // for debug
    if (error.request.status == '401') {
      Message.warning('登录过期,请重新登录!')

    } else if (error.request.status == '404') {
      Message({
        message: '错误的请求!',
        type: 'error',
        duration: 5 * 1000
      })
    } else if (error.request.status == '500') {
      Message({
        message: '服务器异常!',
        type: 'error',
        duration: 5 * 1000
      })
    } else {
      Message({
        message: 'err请求失败',
        type: 'error',
        duration: 5 * 1000
      })
      //router.push({ path: '/404' })
      return Promise.reject(error)
    }
  })

export default service;

二:创建接口文件并且导入刚才封装的axios文件

import request from '../utils/axios'
export default {
	register:function (data) {
    return request({
      url: `${users}/register`,
      method: 'post',
      data
    })
  }
  *//To do something*
  *
  *
}

三:组件内调用封装的接口

import userApi from '../../../interface/user'

  export default {
    data() {
      return {
        user: ''
      }
    },
    async mounted() {
      const {data: {user}} = await userApi.getUser()
      this.user = user
    }
  }
<think>好的,我需要解决用户在Nuxt3中使用Axios拦截器的问题。首先,用户可能已经了解Nuxt的基本概念,但对Axios的集成和拦截器配置不太熟悉。我应该从安装配置开始,逐步引导用户完成步骤。 首先,Nuxt3默认使用`useFetch`和`$fetch`,但用户可能更习惯AxiosAPI,所以需要安装Axios。这时候要检查Nuxt3的插件系统,因为需要创建一个插件来封装Axios实例。记得在Nuxt3中,插件放在`plugins`目录下,并且使用`.ts`或`.js`后缀。 接下来是创建Axios实例。用户可能需要自定义配置,比如设置baseURL,这样每个请求都会基于这个URL。然后在插件中导出这个实例,并通过provide方法将其注入到Nuxt应用中,这样在组件中就可以通过`useNuxtApp().$axios`来访问了。 然后是拦截器的部分。请求拦截器可以用来添加认证头,比如从pinia store中获取token。这里需要注意异步处理,可能需要使用async/await。响应拦截器可以处理全局错误,比如401未授权,跳转到登录页面。同时,要处理可能的网络错误,比如没有响应的情况。 另外,用户可能关心如何在实际组件中使用这个配置好的Axios实例。需要给出一个示例,比如在页面中调用get方法,并捕获错误。同时,提醒用户如果不需要拦截器,可以直接使用原生的$fetch,避免不必要的复杂性。 还需要考虑引用的问题。用户提供的引用中有关于Nuxt.jsAxios的内容,应该引用这些资料来增强权威性。比如引用[^1]提到Nuxt.jsAxios的组合使用,引用[^2]中的组件库可能不直接相关,但可以忽略。 最后,生成相关问题时要围绕Nuxt3Axios的其他常见问题,比如替代方案、SSR中的注意事项、错误处理优化以及如何结合状态管理等。这样可以帮助用户进一步探索相关主题。</think>### Nuxt3Axios拦截器配置与使用 #### 1. 安装与基础配置Nuxt3中使用Axios需要先安装依赖: ```bash npm install axios @nuxtjs/axios ``` 在`nuxt.config.ts`中添加模块声明: ```typescript export default defineNuxtConfig({ modules: [&#39;@nuxtjs/axios&#39;] }) ``` #### 2. 创建Axios实例插件 新建`/plugins/axios.ts`文件: ```typescript export default defineNuxtPlugin((nuxtApp) => { const axiosInstance = axios.create({ baseURL: &#39;https://api.example.com&#39;, timeout: 5000 }) // 请求拦截器 axiosInstance.interceptors.request.use(config => { const token = useCookie(&#39;auth_token&#39;).value if (token) { config.headers.Authorization = `Bearer ${token}` } return config }) // 响应拦截器 axiosInstance.interceptors.response.use( response => response, error => { if (error.response?.status === 401) { navigateTo(&#39;/login&#39;) } return Promise.reject(error) } ) nuxtApp.provide(&#39;axios&#39;, axiosInstance) }) ``` #### 3. 组件中使用 ```vue <script setup> const { $axios } = useNuxtApp() const fetchData = async () => { try { const response = await $axios.get(&#39;/data&#39;) console.log(response.data) } catch (error) { console.error(&#39;请求失败:&#39;, error) } } </script> ``` #### 关键点说明: 1. **SSR兼容性**:通过`useCookie`处理服务端渲染场景的token获取 2. **错误处理**:统一处理401未授权状态码的跳转逻辑 3. **配置复用**:baseURL等通用配置集中管理 4. **类型安全**:建议在`env`文件中配置接口地址 #### 4. 替代方案建议 Nuxt3原生支持`$fetch`方法,如果不需要拦截器功能,可直接使用: ```typescript const { data } = await useFetch(&#39;/api/data&#39;) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值