Noções Básicas de Configuração
8 exemplos para você começar com Configuração para backends Node.js - 6 básicos e 2 intermediários.
Busque em todas as páginas da documentação
8 exemplos para você começar com Configuração para backends Node.js - 6 básicos e 2 intermediários.
npm install zod
npm install -D typescript@5.6 tsx dotenvO Node 24.18.0 lê process.env em tempo de execução. Os valores de produção vêm da plataforma (k8s, ECS, Fly.io), não de arquivos na imagem.
Todas as configurações fluem através de uma única exportação config.
// src/config.ts
import { z } from "zod";
const envSchema = z.object({
NODE_ENV: z.enum(["development", "test", "production"]).default("development"),
PORT: z.coerce.number().default(3000),
DATABASE_URL: z.string().url(),
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
});
export const config = envSchema.parse(process.env);parse lança um erro na inicialização se DATABASE_URL estiver faltando - falha rápida, não na primeira requisiçãoprocess.env diretamenteprocess.env antes de importar config ou usam importação dinâmica após a configuraçãoRelacionado: Validação com Zod e env-schema - configurações tipadas
Segredos rotacionam com mais frequência e precisam de ACLs mais rigorosas.
const envSchema = z.object({
PORT: z.coerce.number().default(3000),
DATABASE_URL: z.string().url(), // segredo - string de conexão
STRIPE_SECRET_KEY: z.string().min(1), // segredo - chave de API
PUBLIC_WEB_URL: z.string().url(), // não-segredo - seguro em logs
});DATABASE_URL ou chaves de API - censure em serializadores PinoRelacionado: Gerenciadores de Segredos - busca na inicialização
.env Local Apenas para Desenvolvimento# .env.example (commitado)
PORT=3000
DATABASE_URL=postgres://localhost:5432/app_dev
LOG_LEVEL=debug// src/bootstrap-env.ts - importado apenas da entrada de desenvolvimento
import { config as loadEnv } from "dotenv";
if (process.env.NODE_ENV !== "production") {
loadEnv();
}.env.example, nunca .envdotenv é uma dependência de desenvolvimento quando possívelRelacionado: dotenv vs Injeção de Plataforma - local vs produção
Evite portas tipadas como string em app.listen.
import { config } from "./config";
const app = express();
app.listen(config.PORT, () => {
console.log(`ouvindo em ${config.PORT} env=${config.NODE_ENV}`);
});z.coerce.number() aceita "3000" de variáveis de ambiente string do k8sconfig.NODE_ENV, não em process.env.NODE_ENV dispersotest usa URL de banco de dados em memória de segredos da CIFlags booleanas de variáveis de ambiente para simples chaves de desligamento.
const envSchema = z.object({
FEATURE_NEW_CHECKOUT: z
.enum(["true", "false"])
.default("false")
.transform((v) => v === "true"),
});.env.example com o proprietário e a data de remoçãoRelacionado: Alternâncias de Funcionalidade e em Tempo de Execução - flags dinâmicas
Ajustes operacionais pertencem à configuração, não a números mágicos codificados.
const envSchema = z.object({
HTTP_TIMEOUT_MS: z.coerce.number().default(30_000),
DB_POOL_MAX: z.coerce.number().default(10),
});let cached: AppConfig | undefined;
export function loadConfig(env = process.env): AppConfig {
if (!cached) cached = envSchema.parse(env);
return cached;
}
export function resetConfigForTests() {
cached = undefined;
}resetConfigForTests() entre casosloadConfig() uma vez na inicialização.refineconst envSchema = z
.object({
REDIS_URL: z.string().url().optional(),
CACHE_ENABLED: z.enum(["true", "false"]).transform((v) => v === "true"),
})
.refine((e) => !e.CACHE_ENABLED || e.REDIS_URL, {
message: "REDIS_URL é necessário quando CACHE_ENABLED=true",
});Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026