Vite+TS集成axios访问分布式后端

424 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

本文介绍如何使用vite集成axios访问分布式后端

先下载axios和qs

直接在package.json中添加dependencies的配置项如下

 "dependencies": {
    "axios": "^0.21.4",
    "echarts": "^5.2.2",
    "element-plus": "^1.3.0-beta.3",
    "qs": "^6.10.2",
    "vue": "^3.2.25",
    "vue-router": "^4.0.12"
  }

然后执行yarn命令下载即可

编写一个统一的request.ts入口

在src下新建utils文件夹,然后在文件夹下新建request.ts文件作为统一的入口,代码如下

import router from '@/router'
import axios from 'axios'
import { ElMessage } from 'element-plus'
// create an axios instance
const service = axios.create({
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  (config) => {
    if (localStorage.getItem('token')) {
      config.headers['admin-front'] = 'Bearer' + ' ' + localStorage.getItem('token')
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// response interceptor
service.interceptors.response.use(
  (response) => {
    const res = response.data
    if (res.code !== 200 && res.code !== 0) {
      if (res.code === 401) {
        // 重新登录
        ElMessage({
          message: '身份认证已失效,请重新登录',
          type: 'error',
          duration: 3 * 1000
        })
        router.push('/login')
      } else if (res.access_token && res.refresh_token) {
        return Promise.resolve(res)
      } else {
        ElMessage({
          message: res.msg || 'Error',
          type: 'error',
          duration: 5 * 1000
        })
      }
      return Promise.resolve(res)
    } else {
      return Promise.resolve(res)
    }
  },
  (error) => {
    if (error.response) {
      if (error.response.status == 404) {
        ElMessage({
          message: `Status:404,正在请求不存在的服务器记录!`,
          type: 'error',
          duration: 5 * 1000
        })
      } else if (error.response.status == 500) {
        ElMessage({
          message: error.response.data.msg
            ? error.response.data.msg
            : `Status:500,服务器发生错误!`,
          type: 'error',
          duration: 5 * 1000
        })
      } else {
        ElMessage({
          message: `Status:${error.response.status},未知错误!`,
          type: 'error',
          duration: 5 * 1000
        })
      }
    } else {
      ElMessage({
        message: '请求服务器无响应!',
        type: 'error',
        duration: 5 * 1000
      })
    }
    return Promise.resolve({ res: error.response.data })
  }
)
// 2、封装请求方式
// @param url 接口地址
// @param data 携带参数
// @param file 上传文件对象
// @param auth 是否携带token
// get请求
export function get(url, data) {
  return service.get<any>(url, data)
}
// post请求
export function post(url, data, params) {
  return service.post<any>(url, data ? data : null, { params: params })
}
// put请求
export function put(url, data, params) {
  return service.put<any>(url, data ? data : null, { params: params })
}
// delete 请求
export function del(url, data) {
  return service.delete(url, data)
}

这里说明一下

  • timeout的超时时间为毫秒。
  • 如果想设置请求头里的参数,例如token的话,写在request的config中
  • 这里我设置token是在stone中读取到才设置,假设后端某个接口需要token而我这里token没有设置的话。可以让后端提示401然后我们重新跳转到login重新登录就行了

访问分布式后端

这里其实和webpackage的设置方法相似,简单的概括一下就是:在请求时以什么开头就访问什么环境,先放一下代码如下

import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { loadEnv } from 'vite'
import path from 'path'
// https://vitejs.dev/config/
export default ({ mode }) => {
  const env = loadEnv(mode, process.cwd())
  return {
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src')
      }
    },
    server: {
      port: 3000,
      proxy: {
        // 如果是 /api 打头,则访问地址如下
        '/api': {
          target: env.VITE_BASE_REQ_URL,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, '')
        },
        '/mock': {
          target: 'www.baidu.com',
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/mock/, '')
        }
      }
    },
    plugins: [
      vue(),
      AutoImport({ resolvers: [ElementPlusResolver()] }),
      Components({
        resolvers: [ElementPlusResolver()]
      })
    ]
  }
}

这里以/mock开头的请求会直接访问百度,以/api开头的的会访问我们设置的base_req_api

创建统一维护api的路径

在src下新建api文件,下边存放我们访问api的入口,建议安装大的功能模块分类。例如:用户管理的添加、修改、删除可以统一放在user.ts
我这里以登录为例,新建一个login.ts,首先引入所有的请求类型,然后定义访问api的方法,最后export出去,简单的写法如下

关于一些以前文章的修正

  • 在引入echart中忘记写需要install echarts依赖了,这里可以看本篇文章的第一步中的运行依赖的echarts版本,然后yarn一下进行下载
  • 关于设置App.vue宽度的问题,我今天访问首页才发现输入框变为百分百了,这里其实只需要设置margin为0即可

结语

欢迎关注我的掘金账号:juejin.cn/user/261290…
欢迎star我的git项目:gitee.com/liangminghu…
下期预告:暂未想好,后续有计划出基于Vite+TS的鉴权管理、低代码平台和在线设计表单(使用第三方插件)的实现