
Posted on • Originally published atblog.lsantos.dev on
Acessando arquivos .env nativamente com Node.js
Começando a semana com uma notícia incrível e uma das novidades mais aguardadas do Node.js em anos, o suportenativo ao uso de arquivos de ambiente, os chamadosdotenvs ouenv-config.
dotenv
Um dos pacotes mais comuns e mais utilizados em toda a comunidade, não só do JavaScript, é o pacotedotenv. Ele faz algo que é super simples mas ao mesmo tempo essencial: carrega variáveis de ambiente na memória do runtime.
Variáveis de ambiente são variáveis especiais que carregam dados protegidos que não podem ser expostos no código e ficam apenas disponíveis no ambiente na qual elas estão inseridas, por exemplo, uma VM ou uma função serverless.
Eu escrevi bastante sobre elasnesse artigo – inclusive usando a antiga forma de carregar as variáveis, com odotenv
, então é até bacana para dar uma olhada em como o Node evoluiu desde lá – mas, essencialmente, variáveis de ambiente são o local ideal para armazenar usuários e senhas de bancos de dados, ou até mesmo secrets de tokens, já que, para acessar e buscar esses dados a aplicação precisa ter acesso à mesma máquina e ao mesmo host, o que é muito mais difícil do que ter acesso somente ao código.
Essas variáveis ficam armazenadas em arquivos que chamamos dedotenv
, ou.env
, que são arquivos definidos no formatoINI
oubash
dependendo do runtime que você está usando (para o dotenv seria o INI), então um arquivo de ambiente poderia ser assim:
SENHA=123USUARIO=123
Porém a gente precisava sempre de um módulo para poder carregar essas variáveis, até a chegada do Deno.
Deno
O Deno mudou bastante a forma que runtimes olham para esses arquivos porque ele permite que você carregue diretamente da suastandard library, ou seja, ao invés de termos que instalar um módulo a parte, podemos usar o que é nativo do runtime:
// app.tsimport { load } from "https://deno.land/std@0.203.0/dotenv/mod.ts";console.log(await load({export: true})); // { GREETING: "hello world" }console.log(Deno.env.get("GREETING")); // hello world
Node 20
O Node 20.6 trazuma mudança fundamental que vai além até do que o Deno já fez,agora é possível ler arquivos .env direto do runtime.
Ao invés de termos que fazer:
require('dotenv').config()const {DB_HOST, DB_PORT, DB_USER, DB_PASS} = process.envconst db = require('alguma-lib-de-banco-de-dados')db.connect({ host: DB_HOST, port: DB_PORT, user: DB_USER, pass: DB_PASS})
Podemos simplesmente utilizar o comandonode --env-file=<caminho> index.js
e todas as variáveis presentes no nosso arquivo definido no caminho serão carregadas no nossoprocess.env
. Por exemplo, imagine um arquivo.env
da seguinte forma:
DB_PASS=passDB_USER=rootDB_PORT=5432DB_HOST=localhost
Quando executarmos o nosso Node com o comandonode --env-file=.env index.js
, poderemos utilizar a variávelprocess.env.DB_PASS
, e ela vai ter o valor depass
, assim como as demais variáveis que estarão perfeitamente setadas na nossa aplicação para uso.
Mas essa não é a única novidade.
Node options
O Node.js permite que você crie uma variável de ambiente chamadaNODE_OPTIONS
, ela permite que você defina todas as opções que seriam passadas ao node no comando principal diretamente na variável, ou seja, se quisermos, por exemplo, iniciar o Node com um inspetor (usando a flag--inspect
) podemos utilizar:NODE_OPTIONS='--inspect'
e agora todas as execuções denode index.js
vão ser como se fossem escritasnode --inspect index.js
Antigamente existia uma forma de deixar essas configurações nopackage.json
, mas o suporte a envs muda tudo, agora você pode deixar as opções do Node (exceto, claro, o próprio--env-file
) em uma variável de ambiente:
NODE_OPTIONS='--inspect --loader=tsx'
Como eu mostrei nomeu artigo sobre TSX, podemos carregar arquivos TypeScript nativamente usando um loader, a ainda por cima podemos carregar o nosso arquivo de ambiente direto, com o comando acima vamos poder rodarnode --env-file=.env index.ts
, por exemplo.
Conclusão
Essa funcionalidade é gigante! Enquanto tira um pacote da nossa lista de dependências, ela ainda permite deixar o nosso código mais simples e direto, mas lembre-se que ela só está disponível a partir da versão20.6.
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse