Investigate and address persistent 404 errors occurring during login and registration processes.
143 lines
4.1 KiB
TypeScript
143 lines
4.1 KiB
TypeScript
|
|
import { supabase } from '@/lib/supabase';
|
|
|
|
/**
|
|
* CORS 문제 확인
|
|
*/
|
|
export const hasCorsIssue = (error: any): boolean => {
|
|
if (!error) return false;
|
|
|
|
const errorMessage = error.message || '';
|
|
return (
|
|
errorMessage.includes('Failed to fetch') ||
|
|
errorMessage.includes('CORS') ||
|
|
errorMessage.includes('Network') ||
|
|
errorMessage.includes('프록시')
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Supabase 연결 상태 확인
|
|
*/
|
|
export const checkSupabaseConnection = async (): Promise<boolean> => {
|
|
try {
|
|
const { data, error } = await supabase.auth.getSession();
|
|
|
|
// 오류가 없으면 연결 성공
|
|
if (!error) {
|
|
return true;
|
|
}
|
|
|
|
// 오류 메시지 확인
|
|
if (error.message && (
|
|
error.message.includes('Failed to fetch') ||
|
|
error.message.includes('Network') ||
|
|
error.message.includes('CORS')
|
|
)) {
|
|
return false;
|
|
}
|
|
|
|
// 다른 오류는 연결은 됐지만 세션/인증 관련 오류이므로 연결은 성공
|
|
return true;
|
|
} catch (err) {
|
|
console.error('Supabase 연결 확인 중 오류:', err);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 서버 연결 상태 검사
|
|
*/
|
|
export const verifyServerConnection = async (): Promise<{
|
|
connected: boolean;
|
|
message: string;
|
|
statusCode?: number;
|
|
}> => {
|
|
try {
|
|
const start = Date.now();
|
|
|
|
// Supabase URL 가져오기
|
|
const supabaseUrl = supabase.auth.url;
|
|
|
|
// 단순 헬스 체크 요청
|
|
try {
|
|
const response = await fetch(`${supabaseUrl}/`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
// 연결 확인만을 위한 요청이므로 짧은 타임아웃 설정
|
|
signal: AbortSignal.timeout(3000)
|
|
});
|
|
|
|
const elapsed = Date.now() - start;
|
|
|
|
// 200, 401, 404 응답도 서버가 살아있다는 신호로 간주
|
|
if (response.ok || response.status === 401 || response.status === 404) {
|
|
return {
|
|
connected: true,
|
|
message: `서버 연결 성공 (응답 시간: ${elapsed}ms)`,
|
|
statusCode: response.status
|
|
};
|
|
} else {
|
|
return {
|
|
connected: false,
|
|
message: `서버 응답 오류: ${response.status} ${response.statusText}`,
|
|
statusCode: response.status
|
|
};
|
|
}
|
|
} catch (fetchError: any) {
|
|
console.error('기본 연결 확인 실패, 대체 경로 시도:', fetchError);
|
|
|
|
// 대체 경로로 재시도
|
|
try {
|
|
const altResponse = await fetch(`${supabaseUrl}/auth/v1/`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
signal: AbortSignal.timeout(3000)
|
|
});
|
|
|
|
// 어떤 응답이라도 오면 서버가 살아있다고 간주
|
|
const elapsed = Date.now() - start;
|
|
return {
|
|
connected: true,
|
|
message: `서버 연결 성공 (대체 경로, 응답 시간: ${elapsed}ms)`,
|
|
statusCode: altResponse.status
|
|
};
|
|
} catch (altError) {
|
|
// 두 가지 경로 모두 실패
|
|
console.error('대체 경로 확인도 실패:', altError);
|
|
throw fetchError; // 원래 에러를 던짐
|
|
}
|
|
}
|
|
} catch (error: any) {
|
|
console.error('서버 연결 확인 중 오류:', error);
|
|
|
|
// 오류 유형에 따른 메시지 설정
|
|
let errorMessage = '알 수 없는 네트워크 오류';
|
|
|
|
if (error.message) {
|
|
if (error.message.includes('Failed to fetch')) {
|
|
errorMessage = 'CORS 정책 오류 또는 서버 연결 실패';
|
|
} else if (error.message.includes('NetworkError')) {
|
|
errorMessage = '네트워크 연결 실패';
|
|
} else if (error.message.includes('TypeError')) {
|
|
errorMessage = '네트워크 요청 형식 오류';
|
|
} else if (error.message.includes('timeout')) {
|
|
errorMessage = '서버 응답 시간 초과';
|
|
} else if (error.message.includes('aborted')) {
|
|
errorMessage = '요청이 중단됨';
|
|
} else {
|
|
errorMessage = error.message;
|
|
}
|
|
}
|
|
|
|
return {
|
|
connected: false,
|
|
message: errorMessage
|
|
};
|
|
}
|
|
};
|