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


相关文章
|
JavaScript
Nuxt.js(Vue SSR)项目配置以及开发细节
Nuxt.js(Vue SSR)项目配置以及开发细节
489 0
|
Java Android开发
|
应用服务中间件 nginx
Nuxt 获取当前域名
Nuxt 获取当前域名
|
机器学习/深度学习 存储 算法
如何将照片或者视频中的背景图抠掉,机器学习开源项目使用 | 机器学习
如何将照片或者视频中的背景图抠掉,机器学习开源项目使用 | 机器学习
如何将照片或者视频中的背景图抠掉,机器学习开源项目使用 | 机器学习
|
移动开发 Unix Linux
拉取代码编辑器中报错`Delete ␍ prettier/prettier` 问题的解决方案
通过正确配置Prettier、EditorConfig文件和编辑器设置,可以有效解决 `Delete ␍ prettier/prettier`的问题。这不仅能避免频繁的格式化错误,还能确保团队成员在不同开发环境下的代码风格一致,提升项目的代码质量和可维护性。按照上述解决方案调整配置后,您的项目将更加规范,代码也会更具一致性。
1159 4
|
缓存 前端开发 JavaScript
Vite 打包优化:全面解析与实践
Vite 作为新一代前端构建工具,以其快速开发体验和高效打包能力著称。然而,在实际项目开发中,为了进一步提升性能和用户体验,我们仍需对 Vite 打包进行优化。本文将深入探讨 Vite 打包优化策略,涵盖代码拆分、资源压缩、缓存利用、构建配置等多个方面,并提供实践案例和最佳实践建议,帮助开发者充分释放 Vite 的潜力。
2891 1
|
9月前
|
JavaScript 前端开发 API
纯js轻量级页面顶部Loading进度条插件
纯js轻量级页面顶部Loading进度条插件
|
12月前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
1888 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
监控 JavaScript 前端开发
使用 `defer` 属性异步加载 JavaScript
【10月更文挑战第24天】使用 `defer` 属性异步加载 JavaScript 是一种有效的提高页面性能和用户体验的方法。通过合理设置 `defer` 属性,可以在不影响页面渲染的情况下异步加载脚本,并确保脚本的执行顺序。在实际应用中,需要根据具体情况选择合适的加载方式,并注意处理可能出现的问题,以确保页面能够正常加载和执行。
|
机器学习/深度学习 监控 安全
智能混凝土:自我修复与环境感应的建筑材料
【10月更文挑战第21天】智能混凝土是一种集自我修复与环境感应于一体的先进建筑材料。通过复合智能型组分,智能混凝土能够实现自感知、自适应和自修复,显著提高结构的耐久性和安全性,减少维修成本,促进环保节能。未来,智能混凝土将向多功能化、智能化和绿色化方向发展,为建筑行业带来革命性变革。

热门文章

最新文章