34
chenyc
2024-12-23 bf7986d6613f61b02da09b2cdb3fa5bdbe6b36dc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// 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
};