Os aplicativos geralmente precisam ser implantados em muitos ambientes diferentes, incluindo preparação, teste e produção, sem criar artefatos específicos do ambiente.

Metodologias como o aplicativo 12 fatores especificar que o código e a configuração de um aplicativo sejam separados, mas combinados durante a implantação para acomodar ambientes específicos.

Variáveis ​​de ambiente são um dos métodos preferidos para definir e consumir valores de configuração específicos do ambiente porque são suportados por todas as principais operações sistemas.

Eles podem ser definidos na maioria das ofertas de plataforma como serviço (PaaS) do provedor de nuvem e são um método comum para configurar plataformas, como o Docker.

No entanto, é às vezes conveniente definir as configurações do aplicativo em um arquivo de configuração local.

Por exemplo, ao desenvolver e depurar aplicativos localmente, especialmente ao trabalhar em muitos ramos de recursos, a capacidade de definir um conjunto de variáveis ​​de ambiente em um arquivo simplifica a experiência do desenvolvedor.

Os arquivos.env fornecem uma solução popular para definir variáveis ​​de ambiente, especialmente em Node.js. Plataformas como Heroku, por exemplo, usam arquivos.env como parte de suas práticas recomendadas.

Nesta postagem, veremos um aplicativo Node.js simples configurado por meio de variáveis ​​de ambiente e exploraremos como personalize um arquivo.env com novas variáveis ​​de ambiente que substituem os valores padrão.

Em seguida, demonstraremos como usar vários arquivos.env personalizados para alternar rapidamente entre várias configurações específicas do ambiente.

Pré-requisitos

O aplicativo de amostra no qual trabalharemos está disponível no GitHub . Para executar o aplicativo localmente, certifique-se de que o Node.js esteja instalado .

Como alternativa, você pode execute o aplicativo em CodeSandBox . Clique no link para abrir o código-fonte do GitHub
em um novo sandbox para construir, executar e expor por meio de um URL aleatório.

O aplicativo Node.js de amostra

O o código a seguir mostra um servidor da web Node.js simples configurado com duas variáveis ​​de ambiente: PORT, que define a porta em que o servidor da web escuta, e MYNAME, que define o nome retornado na resposta HTTP:

const http=require (‘http’); porta const=parseInt (process.env.PORT, 10) || 5000; const name=process.env.MYNAME ||”Matthew”http.createServer ((solicitação, resposta)=> {response.writeHead (200, {‘Content-Type’:’text/plain’}); response.write (‘Hello,’+ name +’!’); response.end ();}). listen (port);

Comece importando o módulo http:

const http=require (‘http’);

Podemos tentar analisar um valor inteiro da variável de ambiente PORT ou usar como padrão a Porta 5000 se a variável de ambiente não estiver definida ou contiver algo diferente de um inteiro:

const port=parseInt (process.env. PORTO, 10) || 5000;

O nome retornado na resposta HTTP pode ser encontrado na variável de ambiente MYNAME ou o padrão é a string Matthew:

const name=process.env.MYNAME ||”Matthew”

Com um servidor web iniciado, ele escuta a porta que acabamos de definir:

http.createServer ((request, response)=> {//…}). Listen (port);

A resposta HTTP é construída na função passada para a função createServer (). Aqui, retornamos o nome definido acima:

response.writeHead (200, {‘Content-Type’:’text/plain’}); response.write (‘Olá,’+ nome +’!’); response.end ();

Agora, podemos executar o aplicativo com o seguinte:

node index.js

Abra http://localhost: 5000 para ver o Hello, Matthew! resposta, o que significa que nosso aplicativo Node.js está sendo executado corretamente.

Por que precisamos substituir as variáveis ​​de ambiente?

Por que ter o trabalho de substituir valores, como números de porta, com variáveis ​​de ambiente em primeiro lugar?

Esses valores já podem passar como argumentos de linha de comando ou carregar de arquivos de configuração JSON ou YAML, fornecendo mais flexibilidade do que variáveis ​​de ambiente expondo um nome simples e pares de valor.

No entanto, como a leitura de valores de variáveis ​​de ambiente geralmente é exigida por soluções PaaS, a variável de ambiente PORT se tornou um padrão de fato para definir qual porta um aplicativo escuta.

Por exemplo, Heroku , AWS , Azure e Google Cloud todos exigem aplicativos Node.js implantados em seus serviços para ouvir a porta definida pela variável de ambiente PORT.

Também é frequentemente necessário usar variáveis ​​de ambiente explicitamente definidas em metodologias como o aplicativo Twelve-Factor metodologia.

Na introdução do post, observamos que esta metodologia requer a definição da configuração de uma aplicação fora do código; a seção de configuração do aplicativo Twelve-Factor entra em mais detalhes:

O aplicativo de doze fatores armazena configuração em variáveis ​​de ambiente (geralmente abreviadas para env vars ou env). Vars de ambiente são fáceis de alterar entre implantações sem alterar nenhum código; ao contrário dos arquivos de configuração, há pouca chance deles serem verificados no repositório de código acidentalmente; e, ao contrário de arquivos de configuração personalizados ou outros mecanismos de configuração, como Propriedades do sistema Java, eles são um padrão independente de linguagem e SO.- “The Twelve-Factor App,” Adam Wiggins

Ao configurar nosso aplicativo por meio de variáveis ​​de ambiente, podemos ter certeza de que nosso código é fácil de implantar e personalizar em uma ampla gama de plataformas.

Definindo variáveis ​​de ambiente em Node.js

Um aplicativo Node.js implantado em uma solução PaaS normalmente deve presumir que o aplicativo está escutando uma porta em um número aleatório. Podemos demonstrar isso localmente definindo a variável de ambiente PORT para um valor diferente de 5000.

Também definiremos a variável de ambiente MYNAME para demonstrar como definir uma configuração específica do aplicativo.

No Linux e macOS, podemos definir essas variáveis ​​de ambiente como este:

PORT=5001 MYNAME=Jane node src/index.js

No Windows PowerShell, podemos definir as variáveis ​​de ambiente como o seguinte:

$ env: PORT=”5001″$ env: MYNAME=”Jane”node src \ index.js

Este processo é gerenciável para nossas duas variáveis ​​de ambiente, mas rapidamente se torna tedioso se precisarmos definir dezenas de variáveis ​​de ambiente cada hora em que o aplicativo é executado. Definir variáveis ​​de ambiente em um arquivo.env fornece uma solução conveniente.

Carregando arquivos.env em Node.js

Node.js não carrega nativamente arquivos.env, então devemos use o pacote dotenv para carregar o arquivo e expor os valores por meio do process.env.

Comece por adicionar dotenv como uma dependência do projeto no arquivo package.json na propriedade dependencies:

{“name”:”node-env-file-demo”,”version”:”1.0.0″,”description”:”Exemplo de Node.js carregando arquivos.env”,”main”:”src/index.js”,”scripts”: {“start”:”nodemon src/index.js”},”dependencies”: {“dotenv”:”10.0.0″},”devDependencies”: {“nodemon”:”1.18.4″},”keywords”: []}

A seguir, baixe a dependência com o seguinte:

npm install

Para carregar o arquivo.env, devemos carregar o pacote dotenv e chamar a função configure () no início do arquivo index.js:

require (‘dotenv’). config ( ); const http=requer (‘http’); porta const=parseInt (process.env.PORT, 10) || 5000; const name=process.env.MYNAME ||”Matthew”http.createServer ((solicitação, resposta)=> {response.writeHead (200, {‘Content-Type’:’text/plain’}); response.write (‘Hello,’+ name +’!’); response.end ();}). listen (port);

Nosso aplicativo agora está pronto para carregar arquivos.env.

Definindo variáveis ​​de ambiente personalizadas em Node.js

Agora podemos criar o arquivo.env no diretório raiz do projeto.

A personalização de um arquivo.env envolve a definição do nome da variável de ambiente que queremos substituir no início de cada linha, seguido por=e o valor da variável. No exemplo abaixo, definimos novos valores para as variáveis ​​de ambiente PORT e MYNAME:

PORT=5001 MYNAME=Jane

Agora, execute o aplicativo com o seguinte comando:

node src/index.js

Em seguida, abra http://localhost: 5001 ; observe que a porta mudou e a mensagem Hello, Jane! retorna.

Pré-carregando dotenv

Uma alternativa para chamar require (‘dotenv’). config () em nosso código é usar a opção de linha de comando-r ou–require para pré-carregar dotenv:

node-r dotenv/config src/index.js

Esta abordagem injeta variáveis ​​de ambiente em um aplicativo Node.js, que de outra forma não suporta arquivos.env, sem editar o código-fonte original.

Usando vários arquivos.env em Node.js

Para permitir que os desenvolvedores troquem rapidamente entre muitos arquivos de ambiente personalizados durante o desenvolvimento, podemos configurar o dotenv para carregar variáveis ​​de ambiente de um arquivo personalizado por meio do DOTENV_CONFIG_PATH variável de ambiente.

Para demonstrar isso, crie um arquivo chamado.env.development no diretório raiz do projeto com o seguinte conteúdo:

PORT=5002 MYNAME=Jill

Em seguida, defina o DOTENV_CONFIG_PATH variável de ambiente para.env.development e execute o aplicativo usando o método de pré-carregamento que acabamos de cobrir.

No Windows PowerShell, execute o aplicativo com com estes comandos:

$ env: DOTENV_CONFIG_PATH=”. env.development”node-r dotenv/config src/index.js

No Linux ou macOS, execute o aplicativo com este comando:

DOTENV_CONFIG_PATH=.env.development node-r dotenv/config src/index.js

Nosso aplicativo agora está disponível em http://localhost: 5002 , e retornará Hello, Jill !.

Excluindo arquivos.env do Git

Como os arquivos.env geralmente contêm informações confidenciais, como strings de conexão de banco de dados, não queremos confirmar esses valores para um repositório Git. Se o fizéssemos, estaríamos compartilhando nossas senhas com qualquer pessoa que possa acessar o código-fonte do aplicativo.

Variáveis ​​de ambiente evitam esse problema porque, por sua própria natureza, seus valores não são definidos em um arquivo. No entanto, devemos excluir especificamente os arquivos.env de nosso repositório Git para evitar o compartilhamento.

Podemos fazer isso criando um arquivo chamado.gitignore no diretório raiz do projeto e adicionando a seguinte linha:

.env *

Agora, o Git ignora o arquivo.env e quaisquer outros arquivos começando com.env como.env.development, o que significa que qualquer informação sensível não terminará em nosso repositório Git.

Conclusão

Incluir variáveis ​​de ambiente em um arquivo.env é uma maneira conveniente de definir muitos valores de configuração relacionados sem gerenciá-los como parte de seu sistema operacional ou defini-los na linha de comando sempre que um aplicativo é executado.