cbvirtua 1.0.18 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/catch.js +87 -0
  2. package/package.json +1 -1
package/catch.js CHANGED
@@ -87,3 +87,90 @@ let VueError = {
87
87
  }
88
88
 
89
89
  export default VueError
90
+ import axios from 'axios'
91
+ import { getToken, setToken, getRefreshToken } from '@utils/auth'
92
+
93
+ // 刷新 access_token 的接口
94
+ const refreshToken = () => {
95
+ return instance.post('/auth/refresh', { refresh_token: getRefreshToken() }, true)
96
+ }
97
+
98
+ // 创建 axios 实例
99
+ const instance = axios.create({
100
+ baseURL: process.env.GATSBY_API_URL,
101
+ timeout: 30000,
102
+ headers: {
103
+ 'Content-Type': 'application/json',
104
+ }
105
+ })
106
+
107
+ let isRefreshing = false // 标记是否正在刷新 token
108
+ let requests = [] // 存储待重发请求的数组
109
+
110
+ instance.interceptors.response.use(response => {
111
+ return response
112
+ }, error => {
113
+ if (!error.response) {
114
+ return Promise.reject(error)
115
+ }
116
+ if (error.response.status === 401 && !error.config.url.includes('/auth/refresh')) {
117
+ const { config } = error
118
+ if (!isRefreshing) {
119
+ isRefreshing = true
120
+ return refreshToken().then(res=> {
121
+ const { access_token } = res.data
122
+ setToken(access_token)
123
+ config.headers.Authorization = `Bearer ${access_token}`
124
+ // token 刷新后将数组的方法重新执行
125
+ requests.forEach((cb) => cb(access_token))
126
+ requests = [] // 重新请求完清空
127
+ return instance(config)
128
+ }).catch(err => {
129
+ console.log('抱歉,您的登录状态已失效,请重新登录!')
130
+ return Promise.reject(err)
131
+ }).finally(() => {
132
+ isRefreshing = false
133
+ })
134
+ } else {
135
+ // 返回未执行 resolve 的 Promise
136
+ return new Promise(resolve => {
137
+ // 用函数形式将 resolve 存入,等待刷新后再执行
138
+ requests.push(token => {
139
+ config.headers.Authorization = `Bearer ${token}`
140
+ resolve(instance(config))
141
+ })
142
+ })
143
+ }
144
+ }
145
+ return Promise.reject(error)
146
+ })
147
+
148
+ // 给请求头添加 access_token
149
+ const setHeaderToken = (isNeedToken) => {
150
+ const accessToken = isNeedToken ? getToken() : null
151
+ if (isNeedToken) { // api 请求需要携带 access_token
152
+ if (!accessToken) {
153
+ console.log('不存在 access_token 则跳转回登录页')
154
+ }
155
+ instance.defaults.headers.common.Authorization = `Bearer ${accessToken}`
156
+ }
157
+ }
158
+
159
+ // 有些 api 并不需要用户授权使用,则无需携带 access_token;默认不携带,需要传则设置第三个参数为 true
160
+ export const get = (url, params = {}, isNeedToken = false) => {
161
+ setHeaderToken(isNeedToken)
162
+ return instance({
163
+ method: 'get',
164
+ url,
165
+ params,
166
+ })
167
+ }
168
+
169
+ export const post = (url, params = {}, isNeedToken = false) => {
170
+ setHeaderToken(isNeedToken)
171
+ return instance({
172
+ method: 'post',
173
+ url,
174
+ data: params,
175
+ })
176
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cbvirtua",
3
- "version": "1.0.18",
3
+ "version": "1.0.19",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {