Trabalhando com Ambientes no NodeJs
🏡 Ambientes
Bem, já sabemos que na maioria das vezes todos os nosso projetos contam com variáveis de ambiente como URL do banco de dados, tokens e etc.
Também sabemos o quão chato é lidar com vários arquivos .env
, como:
↳ .env
↳ .env.local
↳ .env.test
E se existisse uma forma de melhorar essas definições? Melhorar como tratamos, adicionar funções de soma, fallback e etc? Bem, essa é a proposta da minha biblioteca Mozz.Env
.
🍃 Solução
Mozz é uma biblioteca para JavaScript que visa facilitar o manuseio das variaveis de cada ambiente de uma aplicação. Por exemplo, você pode definir ambientes para desenvolvimento, testes e produção, como:
{
"environments": {
"development": {
"@mozz:dotenv": ".env.local",
"database_url": "$env('DATABASE_URL')",
"server_port": "$env('PORT', 3000)"
},
"test": {
"@mozz:dotenv": ".env.test",
"database_url": "$env('DATABASE_URL')",
"server_port": "$env('PORT', 3000)"
},
"production": {
"@mozz:dotenv": ".env",
"database_url": "$env('DATABASE_URL')",
"server_port": "$env('PORT', 3000)"
}
}
}
Note que, agora, definimos três ambientes e em cada um deles usamos uma função, sendo ela:
$env('VARIABLE', fallback?)
Essa função pega uma variável do arquivo .env
que é passada no seu primeiro argumento, caso essa variável retorne um valor nullish
usará o valor passado como fallback (o segundo argumento), entretanto, caso esse valor não exista a biblioteca disparará um erro (sendo o mesmo suprimido apenas com a opção allowUndefinedValues
ativa).
Também definimos uma propriedade chamada @mozz:dotenv
em cada ambiente, essa propriedade serve para indicar a biblioteca qual arquivo com os "secrets" deverá ser carregado.
Bem, mas como dizemos a nossa aplicação para usar os valores de um ambiente especifico? Apenas defina a variável MOZZ_ENV
no seu arquivo .env
raiz indicando o ambiente. Exemplo:
MOZZ_ENV="development"
Agora, para utilizar a biblioteca dentro do código da sua aplicação apenas importe e instancie-a como no exemplo abaixo:
import Mzz from 'mozz.env'
const Enhancer = new Mzz()
console.log(Enhancer.env.database_url) // -> Your Database URL from .env file
Não sei se consegui explicar muito bem o funcionamento da biblioteca, mas tentei! Qualquer coisa podem dar uma olhada no repositório (e talvez deixar uma estrela?) aqui.