Pular para o conteúdo

Valide suas variáveis de ambiente com Zod

· 1 min. de leitura

Também disponível em English
Valide suas variáveis de ambiente com Zod

Zod é a biblioteca de validação mais famosa do ecossistema TypeScript. Com Zod, você cria um schema e valida seus dados de acordo com o schema. Observe o schema abaixo:

import { z } from "zod";

const UserSchema = z.object({
  name: z.string().min(1),
  age: z.number({ coerce: true }).min(18),
  email: z.string().email(),
});

Este schema pode ser usado para validar um objeto da seguinte maneira:

const data = {
  name: "John Doe",
  age: 18,
  email: "john@example.com",
};

// Caso haja um erro na validação, lança um erro
const validatedData = UserSchema.parse(data);

// Caso haja um erro na validação, retorna um objeto com erro, para você tratar posteriormente
const safeValidatedData = UserSchema.safeParse(data);
// => { success: false; error: ZodError }
// => { success: true; data: 'billie' }

O Zod é capaz de fazer diversos tipos de validações nos seus dados, certifique-se de ler a documentação para mais detalhes.

Validando as variáveis de ambiente

Podemos usar o Zod para validar os valores presentes no process.env e até processá-los antes de usar as variáveis de ambiente na nossa aplicação. Normalmente, eu gosto de criar um arquivo environment.ts, como no exemplo abaixo:

import { z } from "zod";

const environmentSchema = z.object({
  // Define os valores possíveis para o NODE_ENV, deixando sempre um valor padrão:
  NODE_ENV: z.enum(["test", "development", "production"]).default("production"),
  // Variáveis de ambiente sempre são definidas como strings. Aqui, transformo a string em número e defino um valor padrão:
  PORT: z.number({ coerce: true }).default(3000),
});

export const env = environmentSchema.parse(process.env);

Depois, é só importar a variável e usar ao longo da minha aplicação:

import Fastify from "fastify";
import { env } from "./environment.js";

const app = Fastify({ logger: true });
app.listen({ port: env.PORT }, (err) => {
  if (err) {
    app.log.error(err);
    process.exit(1);
  }
});