From 7b849f06f0b0986b3955c1d1d91a0b2a79fa7ea6 Mon Sep 17 00:00:00 2001
From: 陈婷婷 <506607603@qq.com>
Date: 星期二, 31 三月 2026 08:40:05 +0800
Subject: [PATCH] Merge branch 'master' of http://101.37.171.70:10101/r/MES-WEB-VUEUI
---
src/utils/healthCheck.js | 105 +++++++++++++++++++++++++++++++++++++---------------
1 files changed, 75 insertions(+), 30 deletions(-)
diff --git a/src/utils/healthCheck.js b/src/utils/healthCheck.js
index 0acd4a0..a873856 100644
--- a/src/utils/healthCheck.js
+++ b/src/utils/healthCheck.js
@@ -6,42 +6,82 @@
healthPath: "/Health",
},
{
- name: "API_INNER",
+ name: "API_OUTER",
baseUrl: process.env.VUE_APP_BASE_API, // 澶栫綉鍦板潃
healthPath: "/Health",
},
];
/**
- * 妫�娴嬪崟涓湇鍔″仴搴风姸鎬�
+ * 甯﹁秴鏃舵帶鍒剁殑 fetch 璇锋眰灏佽
+ * @param {string} url 璇锋眰鍦板潃
+ * @param {Object} options fetch 閰嶇疆
+ * @param {number} timeout 瓒呮椂鏃堕棿锛堟绉掞級锛岄粯璁� 3000ms
+ * @returns {Promise<Response>} 璇锋眰鍝嶅簲
+ */
+const fetchWithTimeout = async (url, options = {}, timeout = 3000) => {
+ // 1. 鍒涘缓涓鎺у埗鍣紝鐢ㄤ簬瓒呮椂鍙栨秷璇锋眰
+ const controller = new AbortController();
+ const signal = controller.signal;
+
+ // 2. 瓒呮椂瀹氭椂鍣細鍒版椂闂村悗涓璇锋眰骞舵姏鍑洪敊璇�
+ const timeoutTimer = setTimeout(() => {
+ controller.abort();
+ throw new Error(`璇锋眰瓒呮椂锛�${timeout}ms锛塦);
+ }, timeout);
+
+ try {
+ // 3. 缁戝畾涓淇″彿鍒� fetch 璇锋眰
+ const response = await fetch(url, {
+ ...options,
+ signal, // 鍏抽敭锛氬叧鑱斾腑姝㈡帶鍒跺櫒
+ });
+ clearTimeout(timeoutTimer); // 璇锋眰鎴愬姛锛屾竻闄よ秴鏃跺畾鏃跺櫒
+ return response;
+ } catch (error) {
+ clearTimeout(timeoutTimer); // 鍑洪敊/瓒呮椂锛屾竻闄ゅ畾鏃跺櫒
+ // 鍖哄垎涓閿欒锛堣秴鏃讹級鍜屽叾浠栭敊璇�
+ if (error.name === 'AbortError') {
+ throw new Error(`璇锋眰瓒呮椂锛�${url} 瓒呰繃 ${timeout}ms 鏈搷搴擿);
+ }
+ throw error; // 鎶涘嚭鍏朵粬閿欒锛堝缃戠粶閿欒锛�
+ }
+};
+
+/**
+ * 妫�娴嬪崟涓湇鍔″仴搴风姸鎬侊紙鏂板瓒呮椂鎺у埗锛�
* @param {Object} service - 鏈嶅姟閰嶇疆锛坆aseUrl + healthPath锛�
* @returns {Promise<String|null>} 鍙敤鐨� baseUrl锛屽け璐ヨ繑鍥� null
*/
export const checkServiceHealth = async (service) => {
const { baseUrl, healthPath } = service;
if (!baseUrl) return null;
- return new Promise(async (resolve, reject) => {
- try {
- // 鍋ュ悍妫�鏌ヨ姹傦紙瓒呮椂 3 绉掞紝涓嶆惡甯� Token锛岄伩鍏嶆湭鐧诲綍鎷︽埅锛�
- const response = await fetch(`${baseUrl}${healthPath}`, {
+
+ try {
+ // 鍋ュ悍妫�鏌ヨ姹傦紙浣跨敤灏佽鐨勫甫瓒呮椂鐨� fetch锛�3绉掕秴鏃讹級
+ const response = await fetchWithTimeout(
+ `${baseUrl}${healthPath}`,
+ {
method: "GET",
- timeout: 3000,
headers: {
"Content-Type": "application/json",
},
- });
- if (response.ok) {
- console.log(`鏈嶅姟 ${service.name} 鍋ュ悍锛屽湴鍧�锛�${baseUrl}`);
- resolve(baseUrl)
- // return baseUrl;
- }
- } catch (error) {
- console.error(`鏈嶅姟 ${service.name} 杩炴帴澶辫触锛歚, error.message);
- resolve(null)
- // return null;
- }
- })
+ },
+ 3000 // 鏄庣‘閰嶇疆 3 绉掕秴鏃�
+ );
+ if (response.ok) {
+ console.log(`鏈嶅姟 ${service.name} 鍋ュ悍锛屽湴鍧�锛�${baseUrl}`);
+ return baseUrl;
+ } else {
+ // 鍝嶅簲鐘舵�佺爜闈� 2xx锛岃涓烘湇鍔′笉鍙敤
+ console.warn(`鏈嶅姟 ${service.name} 鍝嶅簲寮傚父锛岀姸鎬佺爜锛�${response.status}`);
+ return null;
+ }
+ } catch (error) {
+ console.error(`鏈嶅姟 ${service.name} 杩炴帴澶辫触锛歚, error.message);
+ return null;
+ }
};
/**
@@ -50,17 +90,22 @@
*/
export const findAvailableService = async () => {
// 骞惰妫�娴嬫墍鏈夋湇鍔★紙鎻愰珮鏁堢巼锛�
- const healthCheckPromises = serviceList.map((item) => {
- return checkServiceHealth(item)
- });
- const healthResult = await Promise.race(healthCheckPromises); // 绔為�熸ā寮忥紝妫�娴嬪埌鍋ュ悍鐨勯摼鎺ュ氨绔嬪埢杩斿洖
- // 绛涢�夊彲鐢ㄧ殑 baseUrl锛堝彇绗竴涓湁鏁堝湴鍧�锛�
- const availableBaseUrl = healthResult
+ try {
+ const healthCheckPromises = serviceList.map((item) => {
+ return checkServiceHealth(item);
+ });
+ const healthResult = await Promise.all(healthCheckPromises);
+ // 绛涢�夊彲鐢ㄧ殑 baseUrl
+ console.log("鍋ュ悍妫�鏌ョ粨鏋滐細", healthResult);
+ const availableBaseUrl = healthResult.filter((item) => item != null)[0];
- if (availableBaseUrl) {
- return availableBaseUrl;
- } else {
- // 鎵�鏈夋湇鍔″潎涓嶅彲鐢紝鎶涘嚭寮傚父锛堝悗缁湪鍒濆鍖栨椂鎹曡幏锛�
- throw new Error("鎵�鏈夋湇鍔″仴搴锋鏌ュけ璐ワ紝璇锋鏌ユ湇鍔$姸鎬佹垨缃戠粶閰嶇疆");
+ if (availableBaseUrl) {
+ return availableBaseUrl;
+ } else {
+ // 鎵�鏈夋湇鍔″潎涓嶅彲鐢紝鎶涘嚭寮傚父
+ throw new Error("鎵�鏈夋湇鍔″仴搴锋鏌ュけ璐ワ紝璇锋鏌ユ湇鍔$姸鎬佹垨缃戠粶閰嶇疆");
+ }
+ } catch (err) {
+ throw err;
}
};
\ No newline at end of file
--
Gitblit v1.9.1