fix(备份域名): 修复code2session的备份域名逻辑,支持配置多个备份域名列表 (#73)

This commit is contained in:
Ivin Wu
2023-05-15 15:15:43 +08:00
committed by GitHub
parent dbcccbaa78
commit 11404bb4bb
11 changed files with 108 additions and 58 deletions

View File

@@ -24,7 +24,7 @@ export interface IInitOption {
errorHandler?: Function | null; errorHandler?: Function | null;
beforeSend?: Function | null; beforeSend?: Function | null;
systemErrorHandler?: Function | null; systemErrorHandler?: Function | null;
backupDomain?: string; backupDomainList?: IAnyObject;
backupDomainEnableCallback?: Function; backupDomainEnableCallback?: Function;
} }
export interface ICodeToSessionOptions { export interface ICodeToSessionOptions {

View File

@@ -2,9 +2,11 @@ import { IRequestOption, IUploadFileOption } from "../interface";
declare function format(originUrl: string): string; declare function format(originUrl: string): string;
declare function request<TResp>(obj: IRequestOption): Promise<TResp>; declare function request<TResp>(obj: IRequestOption): Promise<TResp>;
declare function uploadFile(obj: IUploadFileOption): any; declare function uploadFile(obj: IUploadFileOption): any;
declare function enableBackupDomain(url?: string): void;
declare const _default: { declare const _default: {
format: typeof format; format: typeof format;
request: typeof request; request: typeof request;
uploadFile: typeof uploadFile; uploadFile: typeof uploadFile;
enableBackupDomain: typeof enableBackupDomain;
}; };
export default _default; export default _default;

4
build/util/url.d.ts vendored
View File

@@ -1,7 +1,9 @@
declare function setParams(url: string | undefined, params: object): string; declare function setParams(url: string | undefined, params: object): string;
declare function replaceDomain(url?: string, domain?: string): string; declare function replaceDomain(url?: string): string;
declare function isInBackupDomainList(url?: string): boolean;
declare const _default: { declare const _default: {
setParams: typeof setParams; setParams: typeof setParams;
replaceDomain: typeof replaceDomain; replaceDomain: typeof replaceDomain;
isInBackupDomainList: typeof isInBackupDomainList;
}; };
export default _default; export default _default;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{ {
"name": "we-request", "name": "we-request",
"version": "1.7.0", "version": "1.7.1",
"description": "本工具通过拓展小程序的wx.request让开发者通过简单的配置实现自动管理登录态等功能", "description": "本工具通过拓展小程序的wx.request让开发者通过简单的配置实现自动管理登录态等功能",
"keywords": [ "keywords": [
"登录态", "登录态",

View File

@@ -57,7 +57,7 @@ export interface IInitOption {
/* 自定义系统错误处理函数 */ /* 自定义系统错误处理函数 */
systemErrorHandler?: Function | null; systemErrorHandler?: Function | null;
/* 备用域名 */ /* 备用域名 */
backupDomain?: string; backupDomainList?: IAnyObject;
/* 备用域名启用时回调函数 */ /* 备用域名启用时回调函数 */
backupDomainEnableCallback?: Function; backupDomainEnableCallback?: Function;
} }

View File

@@ -88,9 +88,7 @@ function initializeRequestObj(obj: IRequestOption) {
} }
// 备用域名逻辑 // 备用域名逻辑
if (status.isEnableBackupDomain && config.backupDomain) { obj.url = url.replaceDomain(obj.url);
obj.url = url.replaceDomain(obj.url, config.backupDomain);
}
durationReporter.start(obj); durationReporter.start(obj);
@@ -131,9 +129,7 @@ function initializeUploadFileObj(obj: IUploadFileOption) {
} }
// 备用域名逻辑 // 备用域名逻辑
if (status.isEnableBackupDomain && config.backupDomain) { obj.url = url.replaceDomain(obj.url);
obj.url = url.replaceDomain(obj.url, config.backupDomain);
}
durationReporter.start(obj); durationReporter.start(obj);
@@ -163,9 +159,9 @@ function doRequest(obj: IRequestOption) {
}, },
fail(res) { fail(res) {
// 如果主域名不可用,且配置了备份域名,且本次请求未使用备份域名 // 如果主域名不可用,且配置了备份域名,且本次请求未使用备份域名
if (res?.errMsg?.indexOf('CONNECTION_REFUSED') >= 0 && config.backupDomain && obj.url.indexOf(config.backupDomain) < 0) { if (res?.errMsg?.indexOf('CONNECTION_REFUSED') >= 0 && url.isInBackupDomainList(obj.url)) {
// 开启备份域名 // 开启备份域名
enableBackupDomain(); enableBackupDomain(obj.url);
// 重试一次 // 重试一次
return doRequest(obj).then((res)=> resolve(res)); return doRequest(obj).then((res)=> resolve(res));
} }
@@ -196,9 +192,9 @@ function doUploadFile(obj: IUploadFileOption) {
}, },
fail(res) { fail(res) {
// 如果主域名不可用,且配置了备份域名,且本次请求未使用备份域名 // 如果主域名不可用,且配置了备份域名,且本次请求未使用备份域名
if (res?.errMsg?.indexOf('CONNECTION_REFUSED') >= 0 && config.backupDomain && obj.url.indexOf(config.backupDomain) < 0) { if (res?.errMsg?.indexOf('CONNECTION_REFUSED') >= 0 && url.isInBackupDomainList(obj.url)) {
// 开启备份域名 // 开启备份域名
enableBackupDomain(); enableBackupDomain(obj.url);
// 重试一次 // 重试一次
return doUploadFile(obj).then((res)=> resolve(res)); return doUploadFile(obj).then((res)=> resolve(res));
} }
@@ -270,11 +266,11 @@ function uploadFile(obj: IUploadFileOption): any {
}) })
} }
function enableBackupDomain() { function enableBackupDomain(url: string = "") {
if (!status.isEnableBackupDomain) { if (!status.isEnableBackupDomain) {
status.isEnableBackupDomain = true; status.isEnableBackupDomain = true;
if (typeof config.backupDomainEnableCallback === 'function') { if (typeof config.backupDomainEnableCallback === 'function') {
config.backupDomainEnableCallback(); config.backupDomainEnableCallback(url);
} }
} }
} }
@@ -282,5 +278,6 @@ function enableBackupDomain() {
export default { export default {
format, format,
request, request,
uploadFile uploadFile,
enableBackupDomain
} }

View File

@@ -5,6 +5,7 @@ import durationReporter from './durationReporter'
import requestHandler from './requestHandler' import requestHandler from './requestHandler'
import loading from '../util/loading' import loading from '../util/loading'
import request from '../api/request' import request from '../api/request'
import url from '../util/url'
import { IRequestOption, IUploadFileOption } from "../interface"; import { IRequestOption, IUploadFileOption } from "../interface";
/* 生命周期内只做一次的checkSession */ /* 生命周期内只做一次的checkSession */
@@ -156,6 +157,9 @@ async function code2Session(code: string) {
obj = config.beforeSend(obj); obj = config.beforeSend(obj);
} }
// 备用域名逻辑
obj.url = url.replaceDomain(obj.url);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let start = new Date().getTime(); let start = new Date().getTime();
wx.request({ wx.request({
@@ -201,6 +205,13 @@ async function code2Session(code: string) {
complete() { complete() {
}, },
fail: (res) => { fail: (res) => {
// 如果主域名不可用,且配置了备份域名,且本次请求未使用备份域名
if (res?.errMsg?.indexOf('CONNECTION_REFUSED') >= 0 && url.isInBackupDomainList(obj.url)) {
// 开启备份域名
requestHandler.enableBackupDomain(obj.url);
// 重试一次
return code2Session(code).then((res)=> resolve(res));
}
return reject({type: "system-error", res}); return reject({type: "system-error", res});
} }
}) })

View File

@@ -1,3 +1,6 @@
import config from '../store/config'
import status from '../store/status'
function setParams(url: string = "", params: object) { function setParams(url: string = "", params: object) {
const queryStringIndex: number = url.indexOf("?"); const queryStringIndex: number = url.indexOf("?");
let kvp: any = {}; let kvp: any = {};
@@ -25,13 +28,33 @@ function setParams(url: string = "", params: object) {
} }
} }
function replaceDomain(url: string = "", domain: string = "") { function replaceDomain(url: string = "") {
// 保证domain只包含域名没有 http(s) 前缀 和 / 后缀 if (status.isEnableBackupDomain && config.backupDomainList && typeof config.backupDomainList === 'object') {
domain = domain.replace(/^http(s)?:\/\//, '').replace(/\/$/, ''); for(const origin in config.backupDomainList) {
return url.replace(/^http(s)?:\/\/(.*?)\//, `https://${domain}/`); if (url.indexOf(origin) >= 0) {
url = url.replace(origin, config.backupDomainList[origin]);
break;
}
}
}
return url;
}
function isInBackupDomainList(url: string = "") {
let res = false;
if (config.backupDomainList && typeof config.backupDomainList === 'object') {
for(const origin in config.backupDomainList) {
if (url.indexOf(origin) >= 0) {
res = true;
break;
}
}
}
return res;
} }
export default { export default {
setParams, setParams,
replaceDomain, replaceDomain,
isInBackupDomainList
}; };

View File

@@ -12,16 +12,4 @@ describe("setParams", () => {
sample = url.setParams(sample, { test2: 2 }); sample = url.setParams(sample, { test2: 2 });
expect(sample).toBe("https://www.example.com?test=1&test2=2"); expect(sample).toBe("https://www.example.com?test=1&test2=2");
}); });
test("replace domain with host", () => {
let sample = "https://example.com/dosomething";
sample = url.replaceDomain(sample, "example2.com");
expect(sample).toBe("https://example2.com/dosomething");
})
test("replace domain with origin", () => {
let sample = "https://example.com/dosomething";
sample = url.replaceDomain(sample, "https://example2.com/");
expect(sample).toBe("https://example2.com/dosomething");
})
}); });