68 lines
2.4 KiB
JavaScript
68 lines
2.4 KiB
JavaScript
/**
|
||
* 公共网络请求封装
|
||
* 职责:统一拼接 baseUrl、Authorization 头,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();
|
||
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 || {};
|
||
|
||
// 自动续期:检查响应头中的新 Token
|
||
var newToken = response.header["X-New-Token"] || response.header["x-new-token"];
|
||
if (newToken) {
|
||
auth.setToken(newToken); // 不传 expiresInSeconds,保留原有的过期时间
|
||
app.globalData.authToken = newToken;
|
||
}
|
||
|
||
if (response.statusCode === 401) {
|
||
// 登录接口的 401 表示用户名或密码错误,不需要跳转登录页
|
||
if (isLoginRequest || isWechatLoginRequest) {
|
||
reject(new Error(result.message || "账号不存在或密码错误"));
|
||
return;
|
||
}
|
||
// 其他接口的 401 表示 token 过期,需要重新登录
|
||
auth.logout();
|
||
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;
|