From 3714621173c606c4c58439ed8941100ce9ddea14 Mon Sep 17 00:00:00 2001
From: Codex Assistant <codex@example.com>
Date: 星期三, 05 十一月 2025 15:10:49 +0800
Subject: [PATCH] bug
---
web/src/config/api.ts | 75 +++++++++++++++++++++++++------------
1 files changed, 51 insertions(+), 24 deletions(-)
diff --git a/web/src/config/api.ts b/web/src/config/api.ts
index 62cf341..ecbdb5e 100644
--- a/web/src/config/api.ts
+++ b/web/src/config/api.ts
@@ -17,54 +17,81 @@
// GraphQL璇锋眰宸ュ叿鍑芥暟
export const graphqlRequest = async (query: string, variables: any = {}) => {
- console.log('=== GraphQL璇锋眰寮�濮� ===');
- console.log('璇锋眰绔偣:', API_CONFIG.GRAPHQL_ENDPOINT);
- console.log('鏌ヨ璇彞:', query);
- console.log('鍙橀噺:', variables);
-
- // 鑾峰彇JWT token
- const { getToken } = await import('@/utils/auth');
+ // 鑾峰彇JWT token涓庡伐鍏�
+ const { getToken, isTokenExpired, clearAuth } = await import('@/utils/auth');
const token = getToken();
- console.log('JWT Token:', token ? '宸茶幏鍙�' : '鏈幏鍙�');
-
+
+ // 鑻oken杩囨湡锛岀洿鎺ユ竻鐞嗗苟璺崇櫥褰�
+ if (!token || isTokenExpired(token)) {
+ clearAuth();
+ // 閬垮厤鍦ㄧ櫥褰曢〉閲嶅璺宠浆閫犳垚鐧藉睆/寰幆
+ const atLogin = typeof window !== 'undefined' && window.location && window.location.hash?.startsWith('#/login');
+ if (!atLogin) {
+ window.location.href = '/#/login';
+ }
+ throw new Error('Token expired or missing')
+ }
+
+ // 鏋勫缓璇锋眰澶�
const headers: Record<string, string> = {
'Content-Type': 'application/json',
};
+
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
- console.log('璇锋眰澶�:', headers);
+ // 鏋勫缓璇锋眰浣�
const requestBody = JSON.stringify({
query,
variables,
});
- console.log('璇锋眰浣�:', requestBody);
try {
+ // 鍙戦�佽姹�
const response = await fetch(API_CONFIG.GRAPHQL_ENDPOINT, {
method: 'POST',
- headers: headers,
+ headers,
body: requestBody,
- })
-
- console.log('鍝嶅簲鐘舵��:', response.status);
- console.log('鍝嶅簲鐘舵�佹枃鏈�:', response.statusText);
+ });
if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`)
+ // 澶勭悊401鏈巿鏉�
+ if (response.status === 401) {
+ const { clearAuth } = await import('@/utils/auth');
+ clearAuth();
+ const atLogin = typeof window !== 'undefined' && window.location && window.location.hash?.startsWith('#/login');
+ if (!atLogin) {
+ window.location.href = '/#/login';
+ }
+ }
+ throw new Error(`HTTP error! status: ${response.status}`);
}
- const result = await response.json()
- console.log('鍝嶅簲缁撴灉:', result);
-
+ const result = await response.json();
+
if (result.errors) {
- console.error('GraphQL閿欒:', result.errors);
- throw new Error(result.errors[0].message)
+ const msg = JSON.stringify(result.errors) || ''
+ // 璇嗗埆璁よ瘉绫婚敊璇叧閿瓧
+ const isAuthError =
+ msg.includes('Unauthorized') ||
+ msg.includes('璁よ瘉') ||
+ msg.includes('unauthorized') ||
+ msg.includes('invalid token') ||
+ msg.includes('expired')
+
+ if (isAuthError) {
+ const { clearAuth } = await import('@/utils/auth');
+ clearAuth();
+ const atLogin = typeof window !== 'undefined' && window.location && window.location.hash?.startsWith('#/login');
+ if (!atLogin) {
+ window.location.href = '/#/login';
+ }
+ }
+ throw new Error(`GraphQL errors: ${msg}`);
}
- console.log('杩斿洖鏁版嵁:', result.data);
- return result.data
+ return result;
} catch (error) {
console.error('=== GraphQL璇锋眰澶辫触 ===');
console.error('閿欒璇︽儏:', error);
--
Gitblit v1.8.0