// 统一的网络请求封装:所有请求都经过此包装器。 // 受保护接口自动携带 Authorization: Bearer ;遇到 401 时由注册的 // 未授权处理器(通常是自动重新登录)处理一次,然后重试原请求。 const { BASE_URL } = require('../config'); let unauthorizedHandler = null; // 注册「未授权」处理回调(由 auth 模块注入,用于自动重新登录) function setUnauthorizedHandler(fn) { unauthorizedHandler = fn; } function request({ url, method = 'GET', data = {}, _retry = false }) { return new Promise((resolve, reject) => { const token = wx.getStorageSync('access_token'); wx.request({ url: BASE_URL + url, method, data, header: { 'content-type': 'application/json', ...(token ? { Authorization: 'Bearer ' + token } : {}) }, success(res) { // 401:尝试一次自动重新登录后重试 if (res.statusCode === 401 && !_retry && unauthorizedHandler) { return unauthorizedHandler() .then((t) => (t ? resolve(request({ url, method, data, _retry: true })) : reject(res))) .catch(() => reject(res)); } if (res.statusCode >= 200 && res.statusCode < 300) { resolve(res.data); } else { wx.showToast({ title: '请求失败 (' + res.statusCode + ')', icon: 'none' }); reject(res); } }, fail(err) { wx.showToast({ title: '网络错误,请稍后重试', icon: 'none' }); reject(err); } }); }); } module.exports = { request, setUnauthorizedHandler };