@thinkboat/wechatjs
Version:
企业微信API SDK for Node
110 lines • 3.75 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseWeChatClient = void 0;
const axios_1 = __importDefault(require("axios"));
const memorystorage_1 = require("../session/memorystorage");
const utils_1 = require("../utils");
class BaseWeChatClient {
constructor(appid, secret, accessToken) {
this.API_BASE_URL = "";
this.AUTO_RETRY = true;
this.MAX_RETRIES = 5;
this.session = new memorystorage_1.MemoryStorage();
this.appid = appid;
this.secret = secret;
if (accessToken) {
this.session.set(this.accessTokenKey(), accessToken);
}
}
async request(url, options) {
const accessToken = await this.accessToken();
// 闭包:内部重试逻辑方法
const _request = async () => {
// 企业微信api报404, 400错误 则重试5次
let retry = 5;
while (true) {
try {
const res = await axios_1.default.request({
url,
method: options.method,
params: { access_token: accessToken, ...options.params },
data: options.data
});
if (res.status in [404, 400]) {
retry -= 1;
if (retry > 0) {
(0, utils_1.sleep)(1000);
continue;
}
}
return res.data;
}
catch (error) {
console.error(error);
}
}
};
// 1) 处理自动加微信 API base_url
if (!url.startsWith('http://') &&
!url.startsWith('https://')) {
this.API_BASE_URL = options.API_BASE_URL || this.API_BASE_URL;
url = `${this.API_BASE_URL}${url}`;
}
// 2) 请求及重试逻辑
const autoRetry = this.AUTO_RETRY;
const maxRetries = autoRetry ? Math.max(this.MAX_RETRIES, 1) : 1;
let retryCnt = 0;
while (retryCnt < maxRetries) {
retryCnt += 1;
let res, result;
try {
res = await _request();
(0, utils_1.sleep)(1000);
}
catch (error) { }
try {
result = this.handleResult(res);
return result;
}
catch (error) { }
}
}
handleResult(res, resultProcessor) {
if ('base_resp' in res) {
}
if ('error_code' in res) {
res.error_code = Number(res.error_code);
}
if (resultProcessor) {
return resultProcessor(res);
}
else {
return res;
}
}
async fetchAccessToken() { }
accessTokenKey() {
return `${this.appid}_access_token`;
}
async accessToken() {
let accessToken = this.session.get(this.accessTokenKey());
if (accessToken) {
return accessToken;
}
else {
accessToken = await this.fetchAccessToken();
return accessToken;
}
}
get(url, params) {
return this.request(url, { method: 'get', params });
}
post(url, data) {
return this.request(url, { method: 'post', data });
}
}
exports.BaseWeChatClient = BaseWeChatClient;
//# sourceMappingURL=index.js.map