import { config } from 'dotenv'; 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 */ const apiRoot = resolve(__dirname, '..'); const nodeEnv = process.env.NODE_ENV ?? 'development'; const layers = [ resolve(apiRoot, `.env.${nodeEnv}`), resolve(apiRoot, `.env.${nodeEnv}.local`), resolve(apiRoot, '.env.local'), resolve(apiRoot, '.env'), ]; for (const file of layers) { if (existsSync(file)) { config({ path: file, override: true }); } } if (!process.env.NODE_ENV) { process.env.NODE_ENV = nodeEnv; }