Douglas Moura

Douglas Moura

Engenheiro de Software

Douglas Moura

Douglas Moura

Engenheiro de software, músico and jiujiteiro

Valide suas variáveis de ambiente com Zod

Publicado em:Publicado em:Atualizado em:

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)
  }
})

Deixe um comentário

Carregando comentários...