// 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 };