You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.1 KiB
99 lines
3.1 KiB
import { FetchOptions } from 'ohmyfetch' |
|
import { RequestCodeEnum, RequestMethodsEnum, RequestConfig } from '@/enums/requestEnums' |
|
import feedback from '@/utils/feedback' |
|
import { merge } from 'lodash-es' |
|
import { Request } from './request' |
|
import { useUserStore } from '@/stores/user' |
|
import { getApiUrl } from '@/utils/env' |
|
export function createRequest(opt?: Partial<FetchOptions>) { |
|
const userStore = useUserStore() |
|
const defaultOptions: FetchOptions = { |
|
// 基础接口地址 |
|
baseURL: getApiUrl(), |
|
//请求头 |
|
headers: { |
|
// version: getVersion(), |
|
}, |
|
retry: 2, |
|
async onRequest({ options }) { |
|
const headers = options.headers || {} |
|
// 添加token |
|
const token = userStore.token |
|
const account = userStore.account |
|
if (token) { |
|
// @ts-ignore |
|
headers[RequestConfig.TOKENNAME] = token |
|
} |
|
options.headers = headers |
|
}, |
|
requestOptions: { |
|
// apiPrefix: getApiPrefix(), |
|
apiPrefix: '/api/', |
|
isTransformResponse: true, |
|
isReturnDefaultResponse: false, |
|
withToken: true, |
|
isParamsToData: true, |
|
requestInterceptorsHook(options) { |
|
const { apiPrefix, isParamsToData } = options.requestOptions |
|
// 拼接请求前缀 |
|
if (apiPrefix) { |
|
options.url = `${apiPrefix}${options.url}` |
|
} |
|
const params = options.params || {} |
|
// POST请求下如果无data,则将params视为data |
|
if ( |
|
isParamsToData && |
|
!Reflect.has(options, 'body') && |
|
options.method?.toUpperCase() === RequestMethodsEnum.POST |
|
) { |
|
options.body = params |
|
options.params = {} |
|
} |
|
return options |
|
}, |
|
async responseInterceptorsHook(response, options) { |
|
|
|
const { isTransformResponse, isReturnDefaultResponse } = options.requestOptions |
|
const headers = Object.fromEntries(response.headers.entries()) |
|
|
|
//返回默认响应,当需要获取响应头及其他数据时可使用 |
|
if (isReturnDefaultResponse) { |
|
return response |
|
} |
|
// 是否需要对数据进行处理 |
|
if (!isTransformResponse) { |
|
return response._data |
|
} |
|
|
|
const { code, data, message } = response._data |
|
const nuxtApp = useNuxtApp() |
|
|
|
// code返回码处理 |
|
switch (code) { |
|
case RequestCodeEnum.SUCCESS: |
|
return Promise.resolve(data) |
|
case RequestCodeEnum.FAIL: |
|
message && feedback.msgError(message) |
|
return Promise.reject(message) |
|
case RequestCodeEnum.PARAMS_FAIL: |
|
message && feedback.msgError(message) |
|
return Promise.reject(message) |
|
case RequestCodeEnum.LOGIN_FAILURE_ONE: |
|
case RequestCodeEnum.LOGIN_FAILURE_TWO: |
|
nuxtApp.$onHandlerLogin() |
|
userStore.logout() |
|
return Promise.reject(message) |
|
default: |
|
return data |
|
} |
|
}, |
|
responseInterceptorsCatchHook(err) { |
|
return err |
|
}, |
|
}, |
|
} |
|
return new Request( |
|
// 深度合并 |
|
merge(defaultOptions, opt || {}), |
|
) |
|
}
|
|
|