nuxt框架中的数据持久化最优解+请求拦截器封装

简介: nuxt框架中的数据持久化最优解+请求拦截器封装

前言:


最近掉进了nuxt.js + ts 项目开发这个坑,今日心态炸裂,吐血整理。

1.nuxt项目中的持久化


1.1 Nuxt 有一个 cookie-universal-nuxt 模块来供服务端操作Cookie值 。

npm install cookie-universal-nuxt
使用方法:
提取:data.userInfo = app.$cookies.get('userInfo')
设置:this.$cookies.set("userInfo",this.formData.mobile,{maxAge:60*60*24*3}) //保存3天

1.2 修改根目录下的 nuxt.config.js,在modules中添加

modules: [
'@nuxtjs/axios',
'cookie-universal-nuxt', // ++++
],

1.3.在store目录下的index,js里面有个 nuxtServerInit 方法

// 定义行为
const actions = {
// 服务端调用
nuxtServerInit ({ commit }, { app }) {
const data = {}
data.userInfo = app.$cookies.get(Key.userInfoKey)
data.accessToken = app.$cookies.get(Key.accessTokenKey)
data.refreshToken = app.$cookies.get(Key.refreshTokenKey)
data.redirectURL = app.$cookies.get(Key.redirectURLKey)
commit('UPDATE_ALL_STATE', data)
},
// ....
m

1.4.页面使用

1. 测试,
2. 在 components/layout/Header.vue 中使用
3. this.$store.state.userInfo 可以获取到数据

1.5. 如果报错:Cannot read property 'get' of undefined

解决:查看 mengxuegu-blog-web\nuxt.config.js 文件中后面是否还有 modules: [ ]

image.png

2.请求拦截器的封装


大体分为两步,在plaugins里面建一个.js或者.ts文件,然后在nuxt.config.js中注册,最后重启项目

附上自己封装的拦截器,分为.js版本和ts版本,以供参考:

export default({store, route, redirect, $axios}) => {
    $axios.onRequest(config => {
        alert(config)
        // console.log("请求拦截器")
        const accessToken = store.state.accessToken
        if(accessToken) {
            // Authorization: Bearer token
            config.headers.Authorization = 'Bearer ' + accessToken
        }
        // 请求头添加token
        return config
    })
    $axios.onResponse(response => {
        // console.log('响应拦截器:', response)
        // if(!store.state.accessToken) {
        //     sendRefreshRequest(route, store, redirect)
        // }
        return response
    })
    $axios.onError(error => {
        // console.log('响应异常:', error.response.status)
        if(error.response.status != 401 ) {
            return Promise.reject(error)
        }
        // 401 发送刷新获取新令牌
        sendRefreshRequest(route, store, redirect)
        return  Promise.reject('令牌过期,重新登录')
    })
}
let isLock = true // 防止并发重复发送刷新令牌请求, true 还未发送,false正在请求刷新
const sendRefreshRequest = (route, store, redirect) => {
    if(isLock && store.state.refreshToken) {
        isLock = false
        // 发送请求到认证客户端,通过刷新令牌获取新令牌
        redirect(`${process.env.authURL}/refresh?redirectURL=${redirectURL(route)}`)
    }else {
        isLock = true
        // 没有刷新令牌,跳转到登录页
        // 重置用户状态
        // console.log('跳转到登录页')
        store.commit('RESET_USER_STATE')
        // 跳转到登录页
        redirect(`${process.env.authURL}?redirectURL=${redirectURL(route)}`)
    }
}  
// 获取重定向地址
const redirectURL = (route) => {
    // 客户端
    if(process.client) {
        return window.location.href
    }
    // 服务端 process.env._AXIOS_BASE_URL_  http://localhost:3000/api   http://blog.mengxuegu.com/api
    return process.env._AXIOS_BASE_URL_.replace('api', '') + route.path
}
import axios, { AxiosInstance, AxiosResponse, AxiosRequestConfig, AxiosError } from 'axios'
const throwErr = (code: number, response: AxiosResponse) => {
  let message: string = '请求错误'
  switch (code) {
    case 400:
      message = '请求错误'
      break
    case 401:
      message = '未授权,请登录'
      break
    case 403:
      message = '拒绝访问'
      break
    case 404:
      message = `请求地址出错: ${response.config.url}`
      break
    case 408:
      message = '请求超时'
      break
    case 500:
      message = '服务器内部错误'
      break
    case 501:
      message = '服务未实现'
      break
    case 502:
      message = '网关错误'
      break
    case 503:
      message = '服务不可用'
      break
    case 504:
      message = '网关超时'
      break
    case 505:
      message = 'HTTP版本不受支持'
      break
    default:
  }
  return message
}
const requestInterceptors = {
  config: (config: AxiosRequestConfig) => {
    // config.headers = {
    //   'Authorization': 'Bearer'
    // }
    if (config.method && config.params) {
      for (const i in config.params) {
        if (config.params[i] == '' && config.params[i] !== 0 && config.params[i] !== false) {
          config.params[i] = null
        }
      }
    }
    return config
  },
  error: (error: AxiosError) => {
    return Promise.reject(error)
  }
}
const responseInterceptors = {
  response: (response: AxiosResponse) => {
    const res = response.data
    return Promise.resolve(res)
  },
  error: (error: AxiosError) => {
    if (error && error.response) {
      // const res = {
      //   Data: null,
      //   State: error.response.status,
      //   Msg: throwErr(error.response.status, error.response)
      // }
      return Promise.reject(error.response)
    }
  }
}
class Request {
  protected axiosInstance: AxiosInstance;
  constructor(baseURL: string) {
    this.axiosInstance = axios.create({
      baseURL,
      timeout:15000
    })
    this.axiosInstance.interceptors.request.use(requestInterceptors.config, requestInterceptors.error)
    this.axiosInstance.interceptors.response.use(responseInterceptors.response, responseInterceptors.error)
  }
}
export default Request


相关文章
|
Java Android开发
|
JavaScript
Nuxt.js(Vue SSR)项目配置以及开发细节
Nuxt.js(Vue SSR)项目配置以及开发细节
661 0
|
前端开发
【前端图表】echarts散点图鼠标划过散点显示信息
【前端图表】echarts散点图鼠标划过散点显示信息
435 0
|
5月前
|
移动开发 JavaScript 前端开发
前端组件库——Wot Design Uni知识点大全(一)
教程来源 https://zlpow.cn Wot Design Uni 是基于 Vue3 + TypeScript 的开源 uni-app UI 组件库,提供 70+ 高质量移动端组件,支持微信/支付宝小程序、H5、App 等多端兼容,内置暗黑模式、国际化(15+语言)与 CSS 变量主题定制,大幅提升跨平台开发效率。
|
前端开发 JavaScript 开发者
这个被忽略的CSS:hover隐藏用法,让交互设计师都跪了
本文详细介绍了CSS中的伪类选择器`:hover`及其应用。`:hover`用于定义鼠标悬停在元素上时的样式,常见于超链接、按钮等交互场景。文章通过多个实例演示了`:hover`不仅可控制当前元素,还能影响其子元素或后代元素,但通常不适用于兄弟元素。此外,还分享了如何避免`:hover`导致的布局抖动问题,如提前设置透明边框。最后,结合实际案例展示了如何利用`:hover`实现复杂的交互效果,例如三级菜单,帮助开发者更好地掌握这一实用技巧。
这个被忽略的CSS:hover隐藏用法,让交互设计师都跪了
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
3287 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
JavaScript 前端开发 API
纯js轻量级页面顶部Loading进度条插件
纯js轻量级页面顶部Loading进度条插件
|
应用服务中间件 网络安全 nginx
Nginx代理HTTPS到Docker指定端口
Nginx代理HTTPS到Docker指定端口
3350 0
|
机器学习/深度学习 监控 安全
智能混凝土:自我修复与环境感应的建筑材料
【10月更文挑战第21天】智能混凝土是一种集自我修复与环境感应于一体的先进建筑材料。通过复合智能型组分,智能混凝土能够实现自感知、自适应和自修复,显著提高结构的耐久性和安全性,减少维修成本,促进环保节能。未来,智能混凝土将向多功能化、智能化和绿色化方向发展,为建筑行业带来革命性变革。
1052 1

热门文章

最新文章