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

68 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 公共网络请求封装
* 职责:统一拼接 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);
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;