跳转到内容

读取 ENV 文件、格式化和验证

最佳实践

ts
import ms from 'ms'
import { config } from 'dotenv'
import { cleanEnv, str, email, json, bool, makeValidator } from 'envalid'

// .env
config()

if (process.env.NODE_ENV) {
  // .env.development / .env.production / .env.test / ...
  config({ path: `.env.${process.env.NODE_ENV}` })
  // 本地配置 .env.development.local / ...
  config({ path: `.env.${process.env.NODE_ENV}.local` })
}

// 自定义时长验证器
const duration = makeValidator<number>((s) => ms(s as ms.StringValue))

// 使用 cleanEnv 验证环境变量
const env = cleanEnv(process.env, {
  API_KEY: str(),
  ADMIN_EMAIL: email({ default: 'admin@example.com' }),
  EMAIL_CONFIG_JSON: json({ desc: 'Additional email parameters' }),
  NODE_ENV: str({
    choices: ['development', 'test', 'production', 'staging'],
  }),
  CORS: str(),
  SOCKET_IO: bool(),
  TOKEN_EXPIRY: duration(),
  PRIVATE_KEY: str(),
})

console.log(env)
txt
NODE_ENV = 'development'

API_KEY = '11111111111111'
ADMIN_EMAIL = 'admin@gmail.com'
EMAIL_CONFIG_JSON = { "host": "smtp.gmail.com", "port": 587, "username": "admin@gmail.com", "password": "admin" }
CORS = '*'
SOCKET_IO = true
TOKEN_EXPIRY = '7d'

# 多行值
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
...
Kh9NV...
...
-----END RSA PRIVATE KEY-----"

输出结果如下:

shell
{
  API_KEY: '11111111111111',
  ADMIN_EMAIL: 'admin@gmail.com',
  EMAIL_CONFIG_JSON: {
    host: 'smtp.gmail.com',
    port: 587,
    username: 'admin@gmail.com',
    password: 'admin'
  },
  NODE_ENV: 'development',
  CORS: '*',
  SOCKET_IO: true,
  TOKEN_EXPIRY: 604800000,
  PRIVATE_KEY: '-----BEGIN RSA PRIVATE KEY-----\n' +
    '...\n' +
    'Kh9NV...\n' +
    '...\n' +
    '-----END RSA PRIVATE KEY-----'
}

以上代码需要安装以下模块:

bash
pnpm add dotenv envalid ms
pnpm add -D @types/ms
bash
yarn add dotenv envalid ms
yarn add -D @types/ms
bash
npm i dotenv envalid ms
npm i -D @types/ms