<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Felipe Borges</title>
    <description>The latest articles on Forem by Felipe Borges (@lipex360).</description>
    <link>https://forem.com/lipex360</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F809660%2Fef9abe28-81e9-4b88-b1ab-068374cf83d5.jpeg</url>
      <title>Forem: Felipe Borges</title>
      <link>https://forem.com/lipex360</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lipex360"/>
    <language>en</language>
    <item>
      <title>Garanta a integridade da sua aplicação: aprenda validar variáveis de ambiente em APIs Node.JS</title>
      <dc:creator>Felipe Borges</dc:creator>
      <pubDate>Mon, 15 May 2023 00:14:25 +0000</pubDate>
      <link>https://forem.com/lipex360/garanta-a-integridade-da-sua-aplicacao-aprenda-validar-variaveis-de-ambiente-em-apis-nodejs-1fma</link>
      <guid>https://forem.com/lipex360/garanta-a-integridade-da-sua-aplicacao-aprenda-validar-variaveis-de-ambiente-em-apis-nodejs-1fma</guid>
      <description>&lt;p&gt;Finalmente consegui finalizar meu primeiro post para o &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nas primeiras tentativas de entregar algo eu falhei miseravelmente pois, simplesmente, a postagem ficava gigantesca demais.&lt;/p&gt;

&lt;p&gt;Dessa vez consegui deixar o escopo fechadinho e de uma maneira que, acredito eu, seja bem fácil de reproduzir.&lt;/p&gt;

&lt;p&gt;Então, chega de falatório (ou escritório...) e vamos começar.&lt;/p&gt;




&lt;h4&gt;
  
  
  ⚡ Pré requisitos
&lt;/h4&gt;

&lt;p&gt;Não vamos criar nada revolucionário ou complexo demais por aqui, já que o intuito é demonstrar como validar as variáveis necessárias para a aplicação subir.&lt;/p&gt;

&lt;p&gt;Para este tutorial, vamos precisar do &lt;code&gt;Node.js&lt;/code&gt; instalado na máquina. Também vou usar o &lt;code&gt;git&lt;/code&gt; para versionar os códigos. Vou partir do princípio de que estes pré-requisitos já estejam atendidos por você, caro leitor.&lt;/p&gt;

&lt;p&gt;Estou utilizando o macOS como sistema operacional e utilizarei o terminal para executar todos os comandos. Se estiver usando Windows, sugiro fortemente que utilize o WSL.&lt;/p&gt;

&lt;p&gt;Também estou usando o &lt;code&gt;yarn&lt;/code&gt; como gerenciador de pacote ao invés do &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  ⚡ Tudo que vamos usar nesse projeto
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;typescript&lt;/li&gt;
&lt;li&gt;fastify&lt;/li&gt;
&lt;li&gt;dotenv&lt;/li&gt;
&lt;li&gt;zod&lt;/li&gt;
&lt;li&gt;tsx&lt;/li&gt;
&lt;li&gt;tsup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um detalhe: estou usando o &lt;code&gt;fastify&lt;/code&gt; pois vou postar mais alguns materiais por aqui usando esse micro-framework. Mas o que vou aplicar aqui é totalmente compatível com o &lt;code&gt;express&lt;/code&gt; ou com frameworks mais parrudos, como o &lt;code&gt;NestJS&lt;/code&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  ⚡ Iniciando o projeto
&lt;/h4&gt;

&lt;p&gt;Vamos iniciar criando um novo diretório &lt;code&gt;env-validate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Abra o terminal e execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;env-validate &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;env-validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos iniciar um projeto node com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já preparando para que os commits no git não suba o diretório &lt;code&gt;node_modules&lt;/code&gt; e o &lt;code&gt;.env&lt;/code&gt;, vamos criar um arquivo &lt;code&gt;.gitignore&lt;/code&gt; na raiz do projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .gitignore &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'.env'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'node_modules'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos fazer um primeiro commit para facilitar a navegação no histórico de versões no futuro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"initial commit"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  ⚡ Iniciando o Fastify e o Typescript
&lt;/h4&gt;

&lt;p&gt;Vamos iniciar um servidor usando o &lt;code&gt;fastify&lt;/code&gt; com uma rota &lt;code&gt;GET /hello&lt;/code&gt; para termos um mínimo de código por aqui.&lt;/p&gt;

&lt;p&gt;Para isso vamos instalar o &lt;code&gt;fastify&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add fastify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como vamos usar Typescript, vamos precisar do próprio &lt;em&gt;typescript&lt;/em&gt; instalado.&lt;/p&gt;

&lt;p&gt;Também vamos precisar instalar a tipagem do node (&lt;em&gt;@types/node&lt;/em&gt;), um interpretador para os arquivos &lt;code&gt;.ts&lt;/code&gt; (&lt;em&gt;tsx&lt;/em&gt;) e um compilador de typescript para javascript (&lt;em&gt;tsup&lt;/em&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; typescript @types/node tsx tsup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o typescript instalado, vamos iniciar o &lt;code&gt;tsconfig.json&lt;/code&gt; com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn tsc &lt;span class="nt"&gt;--init&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para este tutorial não vamos precisar modificar nada neste arquivo&lt;/p&gt;




&lt;p&gt;Agora vamos gerar o arquivo &lt;code&gt;app.ts&lt;/code&gt;, onde as configurações do &lt;code&gt;fastify&lt;/code&gt; estarão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; src/infra &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;touch &lt;/span&gt;src/infra/app.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cole o conteúdo abaixo no arquivo &lt;code&gt;app.ts&lt;/code&gt; gerado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fastify&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FastifyReply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FastifyRequest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fastify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fastify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FastifyRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FastifyReply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código deste arquivo criamos uma constante &lt;code&gt;app&lt;/code&gt; que é uma instância da função &lt;code&gt;fastify&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com essa variável &lt;code&gt;app&lt;/code&gt;, criamos uma rota &lt;code&gt;GET /hello&lt;/code&gt; que retornará uma mensagem 'hello world' com status 200.&lt;/p&gt;

&lt;p&gt;Agora vamos gerar o arquivo &lt;code&gt;server.ts&lt;/code&gt;, que é o nosso entrypoint da aplicação&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/infra/server.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cole o conteúdo abaixo no arquivo &lt;code&gt;server.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3333&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🚀 server started at port 3333&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicando...&lt;/p&gt;

&lt;p&gt;Aqui temos uma função assíncrona &lt;code&gt;bootstrap&lt;/code&gt; que cria um servidor &lt;code&gt;fastify&lt;/code&gt; que veio da variável 'app' importada na primeira linha.&lt;/p&gt;

&lt;p&gt;Este servidor está subindo no endereço &lt;code&gt;http://localhost:3333&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mas para este servidor funcionar, precisamos inserir um script no arquivo &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Abra este arquivo e insira uma nova chave &lt;code&gt;scripts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start:dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsx watch src/infra/server.ts"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para subir o servidor, basta no terminal executar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn start:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que esperamos ver no terminal é a seguinte mensagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R3QPUHCb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qfmb0l9qxeu4bamnrcwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R3QPUHCb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qfmb0l9qxeu4bamnrcwj.png" alt="terminal message with fastify server started" width="454" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma vez visto a bela mensagem de start do servidor, basta acessar via browser o endereço: &lt;code&gt;http://localhost:3333/hello&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se tudo estiver certo, esta é a mensagem que deverá ver no seu browser&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n7VXz9Vy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p921nox5mdc52ndzkceq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n7VXz9Vy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p921nox5mdc52ndzkceq.png" alt="browser hello world message" width="387" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para ver a mensagem formatada assim, estou usando a extensão &lt;code&gt;JSON Viewer&lt;/code&gt; com tema &lt;strong&gt;dark&lt;/strong&gt; no Chrome&lt;/p&gt;

&lt;p&gt;Novo commit para finalizar esse bloco&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fastify server started"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  ⚡ Validando as variáveis de ambiente
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Se ainda estiver com o servidor executando no terminal, encerre o processo com &lt;code&gt;CTRL + C&lt;/code&gt; ou abra uma nova aba/janela.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos gerar um arquivo &lt;code&gt;.env&lt;/code&gt; onde listaremos quais variáveis de ambiente são necessárias para a aplicação iniciar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cole o conteúdo abaixo no arquivo &lt;code&gt;.env&lt;/code&gt; gerado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# API_PORT=3333
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para validar as variáveis de ambiente, vamos utilizar a biblioteca de validação &lt;strong&gt;zod&lt;/strong&gt; e também vamos precisar instalar a biblioteca &lt;strong&gt;dotenv&lt;/strong&gt;. Esta última nos possibilita ler as variáveis de ambiente ao importá-la no início do arquivo &lt;code&gt;env.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Execute no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add zod dotenv 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para criar o arquivo &lt;code&gt;env.ts&lt;/code&gt;, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/infra/env.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cole o conteúdo abaixo no arquivo gerado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;envSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;API_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coerce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getEnv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;envSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;safeParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;errorMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;load environment failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos repassar o que foi colado:&lt;/p&gt;

&lt;p&gt;Primeiro, importamos o &lt;code&gt;dotenv/config&lt;/code&gt; para realizar a leitura do arquivo &lt;code&gt;.env&lt;/code&gt;. Em seguida importamos de dentro do &lt;code&gt;zod&lt;/code&gt; o &lt;em&gt;z&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O zod trabalha com uma série de parâmetros e aqui estamos usando o &lt;code&gt;object&lt;/code&gt; para gerar um &lt;code&gt;schema&lt;/code&gt; com as variáveis necessárias para a aplicação iniciar.&lt;/p&gt;

&lt;p&gt;Neste caso declaramos que a propriedade &lt;code&gt;API_PORT&lt;/code&gt; é do tipo &lt;code&gt;z.coerce.number()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tudo que é importado das variáveis de ambiente do arquivo &lt;code&gt;.env&lt;/code&gt; é interpretado como texto. O termo &lt;code&gt;coerce&lt;/code&gt; utilizando antes do &lt;code&gt;.number()&lt;/code&gt; é uma forma de dizer para o &lt;code&gt;zod&lt;/code&gt; realizar uma conversão do que está chegando (&lt;em&gt;string&lt;/em&gt;) para o formato &lt;code&gt;number&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida criamos uma variável &lt;code&gt;getEnv&lt;/code&gt; onde passamos o &lt;code&gt;envSchema.safeParse(process.env)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O comando &lt;code&gt;safeParse&lt;/code&gt; valida se o que está sendo repassado pelo &lt;code&gt;process.env&lt;/code&gt; atende ao que foi especificado no &lt;code&gt;schema&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Como resultado, a variável &lt;code&gt;getEnv&lt;/code&gt; terá uma propriedade &lt;code&gt;.success&lt;/code&gt; booleana.&lt;/p&gt;

&lt;p&gt;Logo abaixo estamos checando se este &lt;code&gt;.success&lt;/code&gt; falhou e, caso tenha falhado, interrompemos o script com um erro &lt;code&gt;load environment failed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se a validação passar, ou seja, se o &lt;code&gt;.success&lt;/code&gt; for verdadeiro, exportamos a variável &lt;code&gt;env&lt;/code&gt; com os dados obtidos do &lt;code&gt;getEnv.data&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Chegou a hora de testar:&lt;/p&gt;

&lt;p&gt;Volte ao arquivo &lt;code&gt;server.ts&lt;/code&gt; e mude a propriedade &lt;code&gt;port&lt;/code&gt; para que este leia o &lt;code&gt;env.API_PORT&lt;/code&gt; exportado nos passos anteriores.&lt;/p&gt;

&lt;p&gt;o arquivo &lt;code&gt;server.ts&lt;/code&gt; ficará assim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./env&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_PORT&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`🚀 server started at port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aproveitei e também modifiquei a mensagem do console para que a porta passada nas variáveis seja exibida no terminal.&lt;/p&gt;

&lt;p&gt;Agora vamos rodar a aplicação para ver o que acontece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn start:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E... eitaaaa, erro!&lt;/p&gt;

&lt;p&gt;Calma, era o esperado :)&lt;/p&gt;

&lt;p&gt;Como pode observar no terminal, temos a seguinte mensagem de erro no topo da execução:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OWUh59ll--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3u2auhxwuv01rgirhce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OWUh59ll--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3u2auhxwuv01rgirhce.png" alt="terminal env message error" width="556" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa mensagem está aqui porque criamos o nosso arquivo &lt;code&gt;.env&lt;/code&gt; com a variável &lt;code&gt;API_PORT&lt;/code&gt; comentada de propósito.&lt;/p&gt;

&lt;p&gt;Para resolver isso, pare a execução do servidor com &lt;code&gt;CTRL + C&lt;/code&gt;, volte no arquivo &lt;code&gt;.env&lt;/code&gt; e remova o &lt;strong&gt;#&lt;/strong&gt; da primeira linha.&lt;/p&gt;

&lt;p&gt;Seu arquivo &lt;code&gt;.env.&lt;/code&gt; deve ficar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_PORT=3333
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute a aplicação novamente e tudo deve dar certo agora&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn start:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O esperado é você ver o seu terminal com a mensagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1jO99XLi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rinq8u3do3buqg8345ch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1jO99XLi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rinq8u3do3buqg8345ch.png" alt="server started with env environment" width="284" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenho certeza (será?) que tudo deu certo.&lt;/p&gt;

&lt;p&gt;Então vamos criar um novo arquivo &lt;code&gt;.env.example&lt;/code&gt; para que, ao clonar este repositório, seja possível iniciar o projeto apenas renomeando para &lt;code&gt;.env&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env .env.example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E, por último nessa sessão, vamos commitar a coisa toda e partir para a última parte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;                
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"environment variables validated"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  ⚡ Gerando build do projeto
&lt;/h4&gt;

&lt;p&gt;Para finalizar este tutorial, vamos configurar o script que executará o &lt;code&gt;build da aplicação&lt;/code&gt; e o &lt;code&gt;start&lt;/code&gt; da versão final em javascript.&lt;/p&gt;

&lt;p&gt;Para isso, vá até o arquivo &lt;code&gt;package.json&lt;/code&gt; e adicione os scripts abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prebuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc --noEmit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsup src --out-dir build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node build/server.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicando mais uma vez...&lt;/p&gt;

&lt;p&gt;O script &lt;code&gt;build&lt;/code&gt; utiliza a biblioteca &lt;code&gt;tsup&lt;/code&gt; para transpilar os códigos typescript para javascript usando como diretório &lt;code&gt;build&lt;/code&gt; como saída.&lt;/p&gt;

&lt;p&gt;Porém, antes de executar o transpile, o &lt;code&gt;prebuild&lt;/code&gt; é chamado automaticamente para que o typescript faça o transpile por conta própria apenas em memória. Caso algo falhe, o build é interrompido nessa fase.&lt;/p&gt;

&lt;p&gt;Se nada falhar, o diretório &lt;code&gt;build&lt;/code&gt; é populado com os arquivos javascript nos quais o Node.JS será capaz de executar nativamente.&lt;/p&gt;

&lt;p&gt;O script &lt;code&gt;start&lt;/code&gt; executa o servidor já com o arquivo compilado.&lt;/p&gt;

&lt;p&gt;Este é o comando que será utilizado caso esta aplicação esteja publicada.&lt;/p&gt;

&lt;p&gt;Para testar tudo, basta executar no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deverá ver algo como:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_PGAkpFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/66hbdnt8o60cypb3al3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_PGAkpFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/66hbdnt8o60cypb3al3g.png" alt="transpile image" width="626" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora basta executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E verá no seu terminal...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WwO7jlrt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/drsk1ghxp3i6v9q62fr1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WwO7jlrt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/drsk1ghxp3i6v9q62fr1.png" alt="node execute transpiled code" width="490" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Novo commit e fim do tutorial&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;                  
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"app build added"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Ufaaa...&lt;/p&gt;

&lt;p&gt;Assim encerro meu primeiro tutorial postado por aqui.&lt;/p&gt;

&lt;p&gt;Toda e qualquer variável de ambiente necessária para a aplicação poderá ser listada no schema gerado no arquivo &lt;code&gt;env.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dessa forma, caso alguma delas não seja declarada no ambiente onde a aplicação será publicada.&lt;/p&gt;

&lt;p&gt;Por exemplo: variáveis do banco de dados, da AWS ou de qualquer outro provider, variáveis de tokens JWT e por aí vai.&lt;/p&gt;

&lt;p&gt;Basta adicionar o que precisa no schema e está garantido que a aplicação se quer irá iniciar na falta de alguma delas.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado.&lt;/p&gt;

&lt;p&gt;Para acessar o repositório do projeto no github, &lt;a href="https://github.com/lipex360x/env-validate"&gt;clique aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até o próximo ;)&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>api</category>
      <category>node</category>
      <category>fastify</category>
    </item>
  </channel>
</rss>
