dingdanquanliucheng/frontend/mini-app/utils/request.js

68 lines
2.3 KiB
JavaScript
Raw Normal View History

/**
* 公共网络请求封装
2026-06-15 13:18:43 +08:00
* 职责统一拼接 baseUrlAuthorization 401 自动跳转登录自动续期 Token
*/
var auth = require("./auth");
/**
* @param {Object} options - 请求配置
* @param {string} options.url - 请求路径不含基础 URL
* @param {string} [options.method] - HTTP 方法
* @param {Object} [options.data] - 请求体
* @param {Object} [options.header] - 额外请求头
* @returns {Promise<Object>} 解析后的响应数据
*/
function request(options) {
var app = getApp();
var token = auth.getToken();
2026-06-15 14:24:25 +08:00
var isLoginRequest = options.url && options.url.indexOf("/api/auth/login") >= 0;
var isWechatLoginRequest = options.url && options.url.indexOf("/api/auth/wechat-login") >= 0;
return new Promise(function (resolve, reject) {
wx.request({
url: app.globalData.apiBaseUrl + options.url,
method: options.method || "GET",
data: options.data,
header: Object.assign(
{ "Content-Type": "application/json" },
token ? { Authorization: "Bearer " + token } : {},
options.header || {}
),
success: function (response) {
var result = response.data || {};
2026-06-15 13:18:43 +08:00
// 自动续期:检查响应头中的新 Token
var newToken = response.header["X-New-Token"] || response.header["x-new-token"];
if (newToken) {
auth.setToken(newToken);
app.globalData.authToken = newToken;
}
if (response.statusCode === 401) {
2026-06-15 14:24:25 +08:00
// 登录接口的 401 表示用户名或密码错误,不需要跳转登录页
if (isLoginRequest || isWechatLoginRequest) {
reject(new Error(result.message || "账号不存在或密码错误"));
return;
}
// 其他接口的 401 表示 token 过期,需要重新登录
auth.logout();
2026-06-01 11:24:20 +08:00
wx.redirectTo({ url: "/pages/login/login" });
reject(new Error("登录已过期,请重新登录"));
return;
}
if (response.statusCode >= 400 || result.code !== 0) {
reject(new Error(result.message || "请求失败:" + response.statusCode));
return;
}
resolve(result.data);
},
fail: function () {
reject(new Error("网络请求失败,请检查网络"));
},
});
});
}
module.exports = request;