// thirdPartyApi.js
|
const axios = require('axios');
|
const path = require('path');
|
const FormData = require('form-data');
|
const logger = require(path.resolve(__dirname, 'logger'));
|
const BASIC_API = 'https://hemobs.icoldchain.cn/'
|
// const BASIC_API = 'http://testbs.ihemodialysis.com/'
|
let cachedToken = null;
|
let tokenExpiresAt = null;
|
|
|
// 获取 Token 的函数
|
async function getAccessToken() {
|
try {
|
const formData = new FormData();
|
formData.append('user_no', 'data_cyc');
|
formData.append('user_password', 'cheng0624');
|
const response = await axios.post(`${BASIC_API}/user/info/login`, formData, {
|
headers: {
|
'Content-Type': 'multipart/form-data', // 通常不需要手动设置,axios 会自动处理
|
}
|
});
|
// 假设响应中包含 token 字段和 expires_in 秒数
|
const { data } = response.data;
|
const expires_in=3600
|
return { data ,expires_in};
|
} catch (error) {
|
console.error('Error getting access token:', error.message);
|
throw error;
|
}
|
}
|
|
// 获取缓存或新的 Token
|
async function getCachedOrNewToken() {
|
logger.info('获取缓存或新的 Token')
|
if (cachedToken && tokenExpiresAt > Date.now()) {
|
logger.info('有缓存token,直接输出')
|
return cachedToken;
|
}
|
|
// 如果 token 已经过期或不存在,则重新获取
|
logger.info('如果 token 已经过期或不存在,则重新获取')
|
console.log('如果 token 已经过期或不存在,则重新获取')
|
const { data, expires_in } = await getAccessToken();
|
cachedToken = data;
|
tokenExpiresAt = Date.now() + (expires_in - 60) * 1000; // 提前 60 秒刷新 token
|
return cachedToken;
|
}
|
|
// 构建 URL 函数
|
function buildUrl(base, pathParams) {
|
let url = BASIC_API+base;
|
Object.keys(pathParams).forEach(key => {
|
url = url.replace(`:${key}`, encodeURIComponent(pathParams[key]));
|
});
|
return url;
|
}
|
|
// 发起第三方 API 请求 不需要token
|
async function fetchThirdPartyDataNoToke(url, method = 'GET', headers = {}, data = null, queryParams = {}, pathParams = {}) {
|
try {
|
const fullUrl = buildUrl(url, pathParams);
|
logger.info(`打包token 请求头url${fullUrl},data=${JSON.stringify(data)}`)
|
const response = await axios({
|
url: fullUrl,
|
method,
|
headers: {
|
...headers
|
},
|
params: queryParams, // 查询字符串参数
|
data // 请求体参数
|
});
|
|
return response.data;
|
} catch (error) {
|
|
throw error;
|
}
|
}
|
|
// 发起第三方 API 请求
|
async function fetchThirdPartyData(url, method = 'GET', headers = {}, data = null, queryParams = {}, pathParams = {}) {
|
try {
|
const token = await getCachedOrNewToken();
|
const fullUrl = buildUrl(url, pathParams);
|
logger.info(`打包token 请求头url${fullUrl},data=${JSON.stringify(data)}`)
|
const response = await axios({
|
url: fullUrl,
|
method,
|
headers: {
|
...headers,
|
Authorization: `Bearer ${token}`
|
},
|
params: queryParams, // 查询字符串参数
|
data // 请求体参数
|
});
|
|
return response.data;
|
} catch (error) {
|
logger.error(`请求失败!'${error.message} `)
|
throw error;
|
}
|
}
|
|
module.exports = {
|
fetchThirdPartyDataNoToke,
|
fetchThirdPartyData,
|
getAccessToken
|
};
|