Commit 466f9806 by luoqi

fix(web): 登录页 "Invalid base URL" — apiBaseUrl 空串防御 + 同源兜底

NEXT_PUBLIC_API_BASE_URL 是构建期 inline。若 docker compose build 漏带
--env-file apps/pac-web/.env,`${NEXT_PUBLIC_API_BASE_URL}` 插值成空串;
env.ts 原用 `??` 只挡 undefined 挡不住空串 → `new URL(path,'')` 抛
"Failed to construct 'URL': Invalid base URL",登录页直接报错。

改:空/缺失时浏览器端退到同源(prod 反代下 API 与前端同域,天然正确),
SSR 退本地默认。即便构建注入失配,生产也不再硬崩。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
parent f60f4cca
/**
* 解析 API base URL(给 api-client 的 `new URL(path, base)` 用)。
*
* 真理源 = 构建期注入的 NEXT_PUBLIC_API_BASE_URL(Next.js 在 build 时 inline 进 bundle)。
* 防御:`??` 只挡 undefined,挡不住空串 —— 若 docker compose build 漏带
* `--env-file apps/pac-web/.env`,`${NEXT_PUBLIC_API_BASE_URL}` 会插值成空串,
* `new URL(path, '')` 直接抛 "Invalid base URL"(登录页白屏)。
* 所以这里:空/缺失时,浏览器端退到**同源**(prod 反代下 API 与前端同域,天然正确),
* SSR 退到本地默认。即便构建注入失配,生产也不会硬崩。
*/
function resolveApiBaseUrl(): string {
const fromEnv = process.env.NEXT_PUBLIC_API_BASE_URL;
if (fromEnv && fromEnv.trim()) return fromEnv.trim();
if (typeof window !== 'undefined') return window.location.origin;
return 'http://localhost:3101';
}
export const env = {
apiBaseUrl: process.env.NEXT_PUBLIC_API_BASE_URL ?? 'http://localhost:3101',
apiBaseUrl: resolveApiBaseUrl(),
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment