make the relative /api paths in App.tsx actually reach the backend

کدِ auth داخلِ App.tsx مسیرهای نسبی صدا می‌زند (`/api/auth/login` و مانندش).
این مسیرها به دامنه‌ی خودِ فرانت می‌روند، nginx چون آن مسیر را نمی‌شناسد
index.html برمی‌گرداند، و نتیجه پاسخِ ۲۰۰ با بدنه‌ی HTML است — یعنی res.ok
درست به نظر می‌رسد و بعد res.json() با «Unexpected token '<'» می‌شکند.
همین الان روی math.tadrisino2.ir قابلِ بازتولید است.

در حالتِ توسعه پروکسیِ vite حلش می‌کند: هر /api به بک‌اند فرستاده می‌شود و
کدِ موجود بدونِ هیچ تغییری کار می‌کند. مقصد با VITE_API_PROXY_TARGET قابلِ
عوض کردن است، پیش‌فرض بک‌اندِ مشترک.

برای بیلدِ نهایی apiUrl() اضافه شد: fetch(apiUrl('/auth/login')) به‌جای
fetch('/api/auth/login'). یا اگر روی سرور مسیرِ /api به بک‌اند پروکسی شود،
مسیرهای نسبی همان‌طور که هستند درست کار می‌کنند — آن راه حتی بهتر است چون
same-origin می‌شود و CORS از میان برمی‌دارد.

App.tsx دست نخورده؛ تصمیمِ اینکه کدام راه را بروند با خودشان است.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 02:25:55 +03:30
parent 007c450c0a
commit 21cce5ea2b
2 changed files with 33 additions and 0 deletions

View File

@@ -22,6 +22,21 @@ export { ApiError, localTokenStorage, createHttpClient };
export type { Tokens, HttpClient, ClientOptions, RequestOptions };
export * from './types';
/**
* آدرسِ کاملِ یک مسیرِ API.
*
* fetch(apiUrl('/auth/login'), …)
*
* برای کدی که هنوز مستقیم fetch می‌زند. مسیرِ نسبی (`/api/auth/login`) در
* بیلدِ نهایی به دامنه‌ی خودِ فرانت می‌رود، nginx چون مسیر را نمی‌شناسد
* index.html برمی‌گرداند، و نتیجه پاسخِ ۲۰۰ با بدنه‌ی HTML است که موقعِ
* res.json() با «Unexpected token '<'» می‌شکند.
*/
export function apiUrl(path: string): string {
const base = createHttpClient().baseUrl;
return `${base}${path.startsWith('/') ? path : `/${path}`}`;
}
/** پرسش از دستیار کند است (تولیدِ متن)؛ ۱۵ ثانیه‌ی پیش‌فرض کم است. */
const ASK_TIMEOUT_MS = 45_000;