在 uni-app 中使用 axios 会报错:Error: Adapter 'http' is not available in the build
解决方法:为 axios 添加 adapter 适配器。
js
import axios from 'axios';
import settle from '../../node_modules/axios/lib/core/settle';
import buildURL from '../../node_modules/axios/lib/helpers/buildURL';
// 设置基础URL
axios.defaults.baseURL = 'http://localhost:3000';
// 解决 uniapp 适配axios请求,避免报adapter is not a function错误
axios.defaults.adapter = function (config) {
const { method } = config;
return new Promise((resolve, reject) => {
uni.request({
url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
method: method?.toUpperCase(),
header: { ...config.headers },
data: config.data,
responseType: config.responseType,
complete: function complete(response) {
const { data, statusCode, errMsg, header } = response;
const responseInfo = {
data,
status: statusCode,
errMsg,
header,
config: config,
};
settle(resolve, reject, responseInfo);
},
});
});
};
// 请求拦截器
axios.interceptors.request.use(
config => {
const token = uni.getStorageSync('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
error => {
return Promise.reject(error);
}
);
// 响应拦截器
axios.interceptors.response.use(
response => {
return response;
},
error => {
// 处理401错误(未授权)
if (error.response && error.response.status === 401) {
uni.removeStorageSync('token');
uni.removeStorageSync('user');
uni.showToast({
title: '登录已过期,请重新登录',
icon: 'none'
});
window.location.href = '/login';
}
return Promise.reject(error);
}
);
// 认证相关API
export const authAPI = {
register: (userData) => axios.post('/api/auth/register', userData), // 已使用
login: (credentials) => axios.post('/api/auth/login', credentials), // 已使用
getCurrentUser: (object) => axios.post('/api/auth/me', object), // 已使用
updateProfile: (profileData) => axios.put('/api/auth/profile', profileData)
};