From ec748335bf74bbcaca40ef0801a61885beff1d9c Mon Sep 17 00:00:00 2001 From: jacy-dukang Date: Tue, 7 Jul 2026 20:51:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/dukang-api/.env.example | 9 ++++---- server/dukang-api/.env.production.example | 4 ++-- server/dukang-api/src/load-env.ts | 25 ++++++++++++++--------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/server/dukang-api/.env.example b/server/dukang-api/.env.example index 5e71366..b961347 100644 --- a/server/dukang-api/.env.example +++ b/server/dukang-api/.env.example @@ -1,9 +1,8 @@ # 杜康 API 环境变量模板 -# 本地推荐分层: -# .env.development — 集成开关与密钥(MOCK_SMS、阿里云、微信) -# .env — 仅本机项(PORT、DATABASE_URL、REDIS_URL) -# .env.local — 可选本机覆盖(gitignore) -# 生产/预发:bash deploy/sync-api-env.sh development|production +# 本地开发:复制为 .env 后按需修改(pnpm dev:api 仅读取 .env / .env.local) +# 可选 .env.local — 本机覆盖(gitignore) +# 服务器部署:bash deploy/sync-api-env.sh development|production(同步到远端 .env) +# .env.development / .env.production — 部署源模板,本地 dev 不自动加载 DATABASE_URL="mysql://root:root@localhost:3306/dukang_haoke" REDIS_URL="redis://localhost:6379" diff --git a/server/dukang-api/.env.production.example b/server/dukang-api/.env.production.example index 8e5600a..09e496c 100644 --- a/server/dukang-api/.env.production.example +++ b/server/dukang-api/.env.production.example @@ -1,6 +1,6 @@ # 生产环境(真实第三方,关闭 Mock) -# 用法:cp .env.production.example .env.production 后填写密钥 -# 服务器:bash deploy/sync-api-env.sh production +# 用途:deploy/sync-api-env.sh production 的源文件,同步到服务器 .env +# 本地开发请使用 .env(从 .env.example 复制) NODE_ENV=production diff --git a/server/dukang-api/src/load-env.ts b/server/dukang-api/src/load-env.ts index ae8a7b9..b8f5ff8 100644 --- a/server/dukang-api/src/load-env.ts +++ b/server/dukang-api/src/load-env.ts @@ -3,20 +3,25 @@ import { existsSync } from 'fs'; import { resolve } from 'path'; /** - * 分层加载环境变量(后加载的文件覆盖先前的同名键): - * 1. .env.{NODE_ENV} — 集成配置(MOCK_SMS、微信、阿里云等) - * 2. .env.{NODE_ENV}.local / .env.local — 本机覆盖 - * 3. .env — 本机基础(PORT、DATABASE_URL);应只放机器相关项,勿重复 MOCK_SMS + * 环境变量加载策略(后加载的文件覆盖先前的同名键): + * + * - 本地开发(NODE_ENV !== production):仅 `.env` + `.env.local` + * `.env.development` 仅作 deploy/sync-api-env.sh 的源模板,不在本地 dev 自动加载 + * + * - 线上(NODE_ENV=production):`.env.production` → `.env.production.local` → `.env` + * 服务器实际运行时以 sync 脚本写入的 `.env` 为准 */ const apiRoot = resolve(__dirname, '..'); const nodeEnv = process.env.NODE_ENV ?? 'development'; +const isProduction = nodeEnv === 'production'; -const layers = [ - resolve(apiRoot, `.env.${nodeEnv}`), - resolve(apiRoot, `.env.${nodeEnv}.local`), - resolve(apiRoot, '.env.local'), - resolve(apiRoot, '.env'), -]; +const layers = isProduction + ? [ + resolve(apiRoot, '.env.production'), + resolve(apiRoot, '.env.production.local'), + resolve(apiRoot, '.env'), + ] + : [resolve(apiRoot, '.env'), resolve(apiRoot, '.env.local')]; for (const file of layers) { if (existsSync(file)) {