request.js 2.4 KB
// 此vm参数为页面的实例,可以通过它引用vuex中的变量
module.exports = (vm) => {
    // 初始化请求配置
    uni.$u.http.setConfig((config) => {
        /* config 为默认全局配置*/
        config.baseURL = 'http://ydzght.laoban888.vip' /* 根域名 */
        return config
    })
	
	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
	    // 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
	    config.data = config.data || {}
		// 根据custom参数中配置的是否需要token,添加对应的请求头
		if(config?.custom?.auth) {
			// 可以在此通过vm引用vuex中的变量,具体值在vm.$store.state中
			config.header.Authorization = vm.$store.state.user.token
		}
	    return config 
	}, config => { // 可使用async await 做异步操作
	    return Promise.reject(config)
	})
	
	// 响应拦截器
	uni.$u.http.interceptors.response.use(res => {
		// 未设置状态码则默认成功状态
		const code = res.data.code || 200;
		// 获取错误信息
		const msg = errorCode[code] || res.data.msg || errorCode['default']
		// 二进制数据则直接返回
		if (res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer') {
			return res.data
		}
		if (code === 401) {
			uni.$u.toast({ message: '身份验证失败,请重新登录', type: 'error' })
			return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
		} else if (code === 500) {
			uni.$u.toast({ message: msg, type: 'error' })
			return Promise.reject(new Error(msg))
		} else if (code === 601) {
			uni.$u.toast({ message: msg, type: 'warning' })
			return Promise.reject('error')
		} else if (code !== 200) {
			uni.$u.toast({ message: msg, type: 'error' })
			return Promise.reject('error')
		} else {
			return res.data
		}
	},
	  error => {
	    console.log('err' + error)
	    let { message } = error;
	    if (message == "Network Error") {
	      message = "后端接口连接异常";
	    } else if (message.includes("timeout")) {
	      message = "系统接口请求超时";
	    } else if (message.includes("Request failed with status code")) {
	      message = "系统接口" + message.substr(message.length - 3) + "异常";
	    }
			uni.$u.toast({ message: message, type: 'error' })
	    return Promise.reject(error)
	  }
	)
}