Dotenv Environment Layered Loading

Layer environment configuration from shared defaults through environment-specific files up to process environment with explicit override rules.

JavascriptNodeConfig Management

Code

snippet
import { config } from 'dotenv';

const ENV = process.env.NODE_ENV ?? 'development';

// 优先级从低到高:共享默认 → 环境专属 → 容器注入的进程环境
config({ path: '.env.defaults', quiet: true });
config({ path: `.env.${ENV}`, quiet: true });

const layered = { ...process.env };

const required = ['DATABASE_URL', 'REDIS_URL'];
const missing = required.filter((key) => !layered[key]);
if (missing.length > 0) {
  console.error('missing required env vars:', missing.join(', '));
  process.exit(1);
}

export const settings = Object.freeze({
  env: ENV,
  databaseUrl: layered.DATABASE_URL,
  redisUrl: layered.REDIS_URL,
  featureFlags: (layered.FEATURE_FLAGS ?? '').split(',').filter(Boolean),
  http: {
    port: Number(layered.PORT ?? 3000),
    bodyLimitMb: Number(layered.BODY_LIMIT_MB ?? 1),
  },
});

console.log('config resolved for', settings.env, 'port', settings.http.port);