From 21cce5ea2b983b5a017894de091cedabb082c1e6 Mon Sep 17 00:00:00 2001 From: AliReza Date: Mon, 14 Sep 2026 02:25:55 +0330 Subject: [PATCH] make the relative /api paths in App.tsx actually reach the backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit کدِ 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 --- src/api/index.ts | 15 +++++++++++++++ vite.config.ts | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/api/index.ts b/src/api/index.ts index d87069c..d44957a 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -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; diff --git a/vite.config.ts b/vite.config.ts index 13dfa3a..527936a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -31,6 +31,24 @@ export default defineConfig({ }, }, + // در حالتِ توسعه، هر درخواستِ /api به بک‌اند فرستاده می‌شود. + // + // چرا لازم است: کدِ اپ مسیرهای نسبی صدا می‌زند (مثلاً /api/auth/login). بدونِ + // این پروکسی، آن درخواست به خودِ سرورِ vite می‌رود و چون مسیرِ ناشناخته است + // index.html برمی‌گردد — یعنی پاسخِ ۲۰۰ ولی HTML، و کد موقعِ res.json() با + // «Unexpected token '<'» می‌شکند. خطایی که علتش از پیامش معلوم نیست. + // + // مقصد را با VITE_API_PROXY_TARGET عوض کنید (پیش‌فرض: بک‌اندِ مشترک). + server: { + proxy: { + '/api': { + target: process.env.VITE_API_PROXY_TARGET || 'https://api.math.tadrisino2.ir', + changeOrigin: true, + secure: true, + }, + }, + }, + // File types to support raw imports. Never add .css, .tsx, or .ts files to this. assetsInclude: ['**/*.svg', '**/*.csv'], })