Dotenv Environment Layered Loading
Layer environment configuration from shared defaults through environment-specific files up to process environment with explicit override rules.
Code
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);Report a problem with this exampleOpens a pre-filled issue on GitHub.