<?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>DEV Community: Matheus Patricio </title>
    <description>The latest articles on DEV Community by Matheus Patricio  (@matheuspatriciodev).</description>
    <link>https://dev.to/matheuspatriciodev</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%2F3042720%2Fcfe44446-1700-4f2b-b689-5dc6bb16b7e4.jpg</url>
      <title>DEV Community: Matheus Patricio </title>
      <link>https://dev.to/matheuspatriciodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matheuspatriciodev"/>
    <language>en</language>
    <item>
      <title>WebHook x WebSocket : O que são?</title>
      <dc:creator>Matheus Patricio </dc:creator>
      <pubDate>Tue, 30 Dec 2025 20:09:20 +0000</pubDate>
      <link>https://dev.to/matheuspatriciodev/webhook-x-websocket-o-que-sao-32oj</link>
      <guid>https://dev.to/matheuspatriciodev/webhook-x-websocket-o-que-sao-32oj</guid>
      <description>&lt;p&gt;&lt;strong&gt;A importância das integrações&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como desenvolvedor, nos deparamos com diversos tipo de integrações e maneiras de desenvolver uma solução. Um grande exemplo disso, seria uma grande dúvida: Se eu tenho um App que utiliza PSP's (Payment Service Provider), como posso saber que meu pagamento foi Aprovado, Recusado ou deu algum tipo de erro?&lt;/p&gt;

&lt;p&gt;Podemos pensar primeiramente em 3 tipos de soluções: Short pooling, Long Pooling e Webhooks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short Pooling&lt;/strong&gt;&lt;br&gt;
Nesse tipo de integração, o servidor fica enviando requests e recebendo responses em um tempo intervalado pequeno. Basicamento, o servidor fica falando: "Meu pagamento foi processado?", "Meu pagamento foi processado?", "Meu pagamento foi processado?" &lt;/p&gt;

&lt;p&gt;E então o PSP responde: "Ainda não", "Ainda não", "Ainda não", "Opa, aqui estão os seus dados de pagamento!". Assim então, o PSP envia o objeto dos dados do pagamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long Pooling&lt;/strong&gt;&lt;br&gt;
Aqui, a lógica ainda é parecida. A conexão com o servidor e PSP é mantida, até o servidor receber sua response ou receber um timeout. Caso timeout, o servidor inicia outra conexão e fica repetindo esse ciclo até receber os dados corretamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiq078pq79g01m5kz552h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiq078pq79g01m5kz552h.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  WebHook: Aqui a mágica acontece
&lt;/h2&gt;

&lt;p&gt;Um WebHook nada mais que consiste em um endpoint onde o PSP deverá enviar os dados do serviço que você esta utilizando. Um nome mais lógico, segundo Augusto Galego, seria API inversa e você vai entender o porquê disso. Em vez de precisarmos de um API polling, fazendo requests sem parar para o servidor do PSP, podemos simplesmente falar para o PSP o seguinte: "Olha, tenho esse endpoint aqui. Me avise por meio dele quando as minhas requests estiverem prontas". Dessa forma, é salvo poder de processamento tanto do servidor, quanto do PSP ao deixar de usar API polling.&lt;/p&gt;

&lt;p&gt;Exemplo prático: Imagine que você tem um Saas que tem pagamento integrado com por exemplo AbacatePay. Toda vez que você fizer um pagamento, seu servidor irá gerar uma request para AbacatePay, pedindo, por exemplo, um código de pagamento via PIX. Ao receber esse código e efetuar o pagamento, como podemos saber que esse pagamento foi processado corretamente, sem precisar enviar inúmeras requests perguntando para AbacatePay? A resposta é simples: com o Webhook.&lt;/p&gt;

&lt;p&gt;Lembra que falamos: "Abacate, quando meu pagamento for processado, me avise por meio dessa url de webhook."? É exatamente aqui que a Abacate vai falar: "Opa, ok. Aqui estão seus dados do pagamento". E então os dados são enviados para aquele endpoint no seu servidor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas por quê API Inversa?&lt;/strong&gt;&lt;br&gt;
Por quê em vez de precisarmos enviar diversos requests para o PSP, o próprio PSP irá fazer um POST no nosso endpoint com os dados do pagamento. Por isso esse nome lógico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Websocket: Conexão em tempo real
&lt;/h2&gt;

&lt;p&gt;O WebSocket consiste em um protocolo de comunicação em tempo real que permite a troca de mensagens entre cliente e servidor de forma bi-direcional, através de uma conexão persistente.&lt;/p&gt;

&lt;p&gt;Diferente do modelo tradicional HTTP (request/response), no WebSocket a conexão é estabelecida uma única vez e permanece aberta, permitindo que ambas as partes enviem dados a qualquer momento, sem a necessidade de novas requisições. Após um &lt;em&gt;handshake&lt;/em&gt; inicial via HTTP, a comunicação passa a ocorrer por meio de frames WebSocket, o que reduz significativamente o overhead e resulta em baixa latência.&lt;/p&gt;

&lt;p&gt;Esse modelo é amplamente utilizado em cenários que exigem atualizações em tempo real, como chats, dashboards em tempo real, jogos online, notificações e monitoramento de sistemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo prático
&lt;/h3&gt;

&lt;p&gt;Imagine que você possui um SaaS com um painel administrativo em tempo real, onde o usuário acompanha o status de pagamentos realizados na plataforma.&lt;/p&gt;

&lt;p&gt;Quando um pagamento é iniciado, seu backend se comunica com o PSP (via API ou Webhook). Assim que o pagamento é aprovado, recusado ou apresenta erro, o backend recebe essa informação.&lt;br&gt;
Agora, como informar isso instantaneamente para o usuário que está com o dashboard aberto no navegador?&lt;/p&gt;

&lt;p&gt;É aqui que o &lt;strong&gt;WebSocket&lt;/strong&gt; entra.&lt;/p&gt;

&lt;p&gt;Ao acessar o painel, o frontend do usuário estabelece uma &lt;strong&gt;conexão WebSocket&lt;/strong&gt; com o seu servidor. Essa conexão permanece ativa enquanto o usuário estiver logado. Quando o backend recebe a confirmação do pagamento (por exemplo, via Webhook do PSP), ele &lt;strong&gt;envia imediatamente uma mensagem pelo WebSocket&lt;/strong&gt; para o cliente conectado, informando:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Pagamento aprovado",&lt;br&gt;
"Pagamento recusado",&lt;br&gt;
ou "Erro no processamento do pagamento".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dessa forma, o usuário vê a atualização &lt;strong&gt;em tempo real&lt;/strong&gt;, sem precisar atualizar a página ou fazer novas requisições HTTP.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>Amazon Elastic Compute Cloud (Amazon EC2)</title>
      <dc:creator>Matheus Patricio </dc:creator>
      <pubDate>Wed, 28 May 2025 02:23:14 +0000</pubDate>
      <link>https://dev.to/matheuspatriciodev/amazon-elastic-compute-cloud-amazon-ec2-2e1l</link>
      <guid>https://dev.to/matheuspatriciodev/amazon-elastic-compute-cloud-amazon-ec2-2e1l</guid>
      <description>&lt;h1&gt;
  
  
  O que é o Amazon EC2?
&lt;/h1&gt;

&lt;p&gt;Basicamente, define-se o EC2 como a máquina virtual como um serviço. a AWS fornece a capacidade computacional e redimensionável como instancias do Amazon EC2.&lt;/p&gt;

&lt;p&gt;A AWS oferece a plataforma de computação com mais de 750 instâncias e opções de processadores, armazenamentos, redes, sistemas operacionais e modelos de compras mais recentes para ajudar você a atender melhor às necessidades da sua workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como são os recursos on-premises tradicionais?
&lt;/h2&gt;

&lt;p&gt;São compostos por componentes de hardware complexos, onde se necessitava gastar com hardware antecipadamente, aguardar qeu os servidores sejam entregues a sua empresa, preparar uma sala especifica para comportar e manter os servidores e fazer todas as configurações necessárias como Firewall, anti-virus, Sistema operacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens de utilizar uma instância do EC2:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Capacidade de provisionar e iniciar uma instacia EC2 em minutos&lt;/li&gt;
&lt;li&gt;Capacidade de interromper o trabalho quando terminar o trabalho desejado&lt;/li&gt;
&lt;li&gt;Economia de custos, pagando apenas oque foi utilizado no tempo/uso de computação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipos de instancias do Amazon EC2
&lt;/h3&gt;

&lt;p&gt;Os tipos de instâncias do Amazon EC2 são otimizadas para tarefas diferentes. Dessa forma, voce deve considerar as necessidades específicas de suas cargas de trabalho e aplicações.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instancias de uso geral&lt;/strong&gt;: Equilibram os recusos de computação, memória e rede. Pode ser usada em diversas cargas de trabalho como servidores de aplicações, servidores de jogos, backend de aplicações, bancos de dados. Ideal para aplicações/serviços que não precisam otimização em nenhuma área de recurso único.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instâncias otimizadas para computação&lt;/strong&gt;: Ideais para computação que usam processadores de alto desempenho. Sendo possivel usar em cargas de trabalho pesado de processamento em lote, com o processamento de muitas transações em um unico grupo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instâncias otimizadas para memória&lt;/strong&gt;: Tem desempenho rápido para cargas qeu processam grandes conjuntos de dados na memória. Esse cenário pode ser um banco de dados de alto desempenho ou carga de trabalho que envolva a execução de processamento em tempo real de uma grande quantidade de dados não estruturados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instâncias otimizadas para Computação acelerada&lt;/strong&gt;: Usam aceleradores de hardware, ou coprocessadores, para executar algumas funções de maneira mais eficiente do que é possivel em um software executado por CPUs. Um grande exemplo de uso são calculos complexos, processamento de gráficos, correspondencia de padrões de dados. Sendo ideal para aplicativos gráficos e streaming de jogos e apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instâncias otimizadas para armazenamento&lt;/strong&gt;: São projetadas para cargas de trabalho que exigem alto acesso sequencial de leitura e gravação e grandes conjuntos de dados no armazenamento local. Grande exemplos são sistemas de arquivos distribuídos, aplicações de data warehouse e sistemas de processamento de transação on-line (OLTP) de alta frequência. Ideal para aplicativos com altos requisitos de IOPS.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Definição de precos do Amazon EC2
&lt;/h2&gt;

&lt;p&gt;Com o Amazon EC2, voce paga apenas pelo tempo de computação que usar. A Amazon oferece diversas opções de preço para diferentes de casos de uso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sob demanda&lt;/strong&gt;: São ideias para cargas de trabalho irregulares, onde são executadas continuamente até que sejam interrompidas, e voce paga apenas pelo tempo que usou. Normalmente usadas para desenvolvimento e teste de aplicações.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instâncias reservadas&lt;/strong&gt;: São um desconto no valor do uso de instâncias sob demanda. Possuem vigencia de 1 ou 3 anos, sendo que a maior economia de custos se dá com a opção de 3 anos. Há dois tipos de instância reservada: A padrão que é adequada se o cliente souber o tipo e o tamanho da instancia e em qual regiao da AWS planeja executa-las. E as conversíveis, que é adequada quando voce precisa executar as instancias em diferentes zonas de disponibilidade ou diferentes tipos de instancia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Saving Plans da instância do EC2&lt;/strong&gt;: Assume compromisso de gasto por hora com uma familia de instâncias e uma região por um período de um ou três anos. Gera uma economia de até 72% comparado com instâncias sob demanda. Nesse caso, não é necessário especificar antecipadamente qual tipo e tamnho da istância do EC2, SO, Tenacy. Além disso não é necessário se comprometer com um determinado número de instâncias do EC2. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instâncias spot&lt;/strong&gt;: São idais para cargas de trabalho com horários de inicio e término flexiveis ou que toleram interrupções. Usam a capacidade de computação não utilizada do Amazon EC2 e tem até 90% de desconto em relação a sob demanda. As instâncias sport poderão ser interrompidas se não houver mais capacidade disponível ou se a demanda por essas instâncias aumentar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hosts dedicados&lt;/strong&gt;: São servidores fisicos com capacidade de instancia do Amazon EC2 taotalmente dedicada ao uso do cliente. Podendo comprar as licenças de uso de software por soquete, nucleo ou por VM. Além disso, adquirir hosts dedicados sob demanda e reservas de hosts dedicados. São os mais caros entre todas opções.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Conclusão
&lt;/h2&gt;

&lt;p&gt;O Amazon EC2 oferece uma base robusta e flexível para executar aplicações na nuvem, permitindo que empresas dimensionem seus recursos de forma rápida, segura e econômica. Com opções personalizáveis de instâncias, modelos de cobrança sob demanda e ampla integração com outros serviços da AWS, o EC2 capacita organizações a atenderem desde pequenas aplicações até cargas de trabalho corporativas complexas. Ao entender seu funcionamento e possibilidades, as empresas podem usar o EC2 como um pilar essencial para inovação, alta disponibilidade e crescimento sustentável na nuvem.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎓Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/pt/ec2/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧑‍💻 Autor
&lt;/h3&gt;

&lt;p&gt;Matheus Patricio&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde me achar?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/matheuspatriciof/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Matheus-Patricio-dev" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://matheus-patricio.vercel.app/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🙏 Agradecimentos
&lt;/h3&gt;

&lt;p&gt;Se você ficou até aqui, agradeço de coração.&lt;br&gt;
Até mais!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ec2</category>
      <category>cloud</category>
      <category>learning</category>
    </item>
    <item>
      <title>☁️ Conceitos básicos de Computação em nuvem ☁️</title>
      <dc:creator>Matheus Patricio </dc:creator>
      <pubDate>Sat, 24 May 2025 13:34:35 +0000</pubDate>
      <link>https://dev.to/matheuspatriciodev/conceitos-basicos-de-computacao-em-nuvem-4ipg</link>
      <guid>https://dev.to/matheuspatriciodev/conceitos-basicos-de-computacao-em-nuvem-4ipg</guid>
      <description>&lt;h1&gt;
  
  
  ☁️ O que é Cloud Computing?
&lt;/h1&gt;

&lt;p&gt;Cloud computing é o conceito de fornecimento de recurso de TI (Tecnologia da informação) sob demanda com pagamento conforme o uso. Os recursos abragem tecnologias como: servidores, armazenamento, banco de dados, redes, softwares.&lt;/p&gt;

&lt;p&gt;Provedores como Amazon Web Services(AWS), Google Cloud Platform(GCP), Microsoft Azure, Oracle Cloud são responsáveis por fornecer e gerenciar tais recursos para seus clientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Mas por que usar Cloud Computing na minha empresa/serviço?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redução de custos&lt;/strong&gt;: O primeiro grande motivo que a maioria das empresas toma a decisão de usar Cloud Computing é Redução de custos, isso por não necessitar de grandes investimentos inicias em hardware e tempo de implementação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elasticidade&lt;/strong&gt;: Outro grande motivo é a capacidade de aumentar ou diminuir recursos de acordo com as necessidades. A provedora de cloud faz o ajuste automático dos recursos para lidar com variações de demanda, seja ela de tráfego, RAM, processamento ou armazenamento, garantindo desempenho e economia sem intervenção manual.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt; : É a capacidade de aumentar ou diminuir recursos de acordo com as necessidades. A provedora disponibiliza maiores e melhores recursos para atender melhor o seu serviço/empresa. A grande diferença de escalabilidade e elasticidade é que na elasticidade os recursos são gerenciados conforme a demanda de forma dinâmica, já a escalabilidade é o aumento de recursos de forma planejada, pensando principalmente no futuro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disponibilidade global&lt;/strong&gt;: Significa que os serviços estão disponíveis e acessíveis o tempo todo e de, basicamente, qualquer lugar do mundo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agilidade e velocidade&lt;/strong&gt;: A implementação de novos servidores e serviços das provedoras de cloud estão no espaço tempo de alguns cliques, sendo assim a implementação ou mudanças nos servidores e serviços, extremamente rápida.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌎 Modelos de serviços em cloud computing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Iaas&lt;/strong&gt; &lt;em&gt;(Infraestructure as a service)&lt;/em&gt; : Nesse modelo a provedora fornece serviços como servidores, bancos de dados, redes, armazenamento. O cliente gerencia o sistema operacional, aplicativos e dados, enquanto o provedor cuida da infraestrutura física. Exemplos são: &lt;em&gt;Amazon EC2, Microsoft Azure VMs&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Paas&lt;/strong&gt; &lt;em&gt;(Platform as a service)&lt;/em&gt; : Nesse modelo a provedora fornece um ambiente completo para desenvolvimento, testes e implantação de aplicações. O provedor gerencia infraestrutura, sistema operacional e plataformas, deixando o usuário focar apenas no código e na lógica da aplicação. Exemplos são: &lt;em&gt;Google App Engine, Microsoft Azure App Services.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Saas&lt;/strong&gt; &lt;em&gt;(Software as a service)&lt;/em&gt; : Nesse modelo é composto por aplicações prontas para uso, acessadas pela internet via navegador, sem necessidade de instalação ou manutenção local. O provedor cuida de tudo: infraestrutura, aplicação, atualizações e segurança. Exemplos são: &lt;em&gt;Google Workspace (Gmail, Docs), Microsoft 365, Salesforce&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌌 Modelos de Implementação em Cloud Computing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nuvem Pública&lt;/strong&gt; &lt;em&gt;(Public Cloud)&lt;/em&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infraestrutura gerenciada por um provedor externo e compartilhada com outros clientes.
&lt;/li&gt;
&lt;li&gt;Mais escalável e com menor custo inicial.
&lt;/li&gt;
&lt;li&gt;Exemplo: AWS, Azure, Google Cloud.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Nuvem Privada&lt;/strong&gt; &lt;em&gt;(Private Cloud)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infraestrutura dedicada exclusivamente a uma organização.
&lt;/li&gt;
&lt;li&gt;Maior controle, segurança e personalização.
&lt;/li&gt;
&lt;li&gt;Pode ser local (on-premise) ou hospedada por terceiros.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Nuvem Híbrida&lt;/strong&gt; &lt;em&gt;(Hybrid Cloud)&lt;/em&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Combinação de nuvem pública e privada.
&lt;/li&gt;
&lt;li&gt;Permite mover dados e aplicações entre ambientes conforme a necessidade.
&lt;/li&gt;
&lt;li&gt;Flexível e ideal para cargas sensíveis e variáveis.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Multinuvem&lt;/strong&gt; &lt;em&gt;(Multicloud)&lt;/em&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de múltiplos provedores de nuvem pública ao mesmo tempo.
&lt;/li&gt;
&lt;li&gt;Aumenta a disponibilidade e evita dependência de um único fornecedor.
&lt;/li&gt;
&lt;li&gt;Exemplo: usar AWS para computação e Google Cloud para Big Data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Conclusão
&lt;/h2&gt;

&lt;p&gt;A computação em nuvem oferece uma ampla gama de benefícios e vantagens, desde redução de custos e aumento da escalabilidade até maior agilidade e disponibilidade global. Ao compreender os diferentes modelos e conceitos-chave, as empresas podem aproveitar ao máximo o poder da nuvem para impulsionar a inovação e o crescimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎓Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/pt/what-is-cloud-computing/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;&lt;br&gt;
&lt;a href="https://cloud.google.com/learn/what-is-cloud-computing?hl=pt-BR" rel="noopener noreferrer"&gt;GCP&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧑‍💻 Autor
&lt;/h3&gt;

&lt;p&gt;Matheus Patricio&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde me achar?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/matheuspatriciof/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Matheus-Patricio-dev" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://matheus-patricio.vercel.app/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🙏 Agradecimentos
&lt;/h3&gt;

&lt;p&gt;Se você ficou até aqui, agradeço de coração.&lt;br&gt;
Até mais!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Validações com biblioteca Yup</title>
      <dc:creator>Matheus Patricio </dc:creator>
      <pubDate>Fri, 18 Apr 2025 17:55:52 +0000</pubDate>
      <link>https://dev.to/matheuspatriciodev/validacoes-com-biblioteca-yup-3dgb</link>
      <guid>https://dev.to/matheuspatriciodev/validacoes-com-biblioteca-yup-3dgb</guid>
      <description>&lt;p&gt;Quando lidamos com formulários, inserções de dados em algum serviço como enviar um POST para um banco de dados, salvando os dados inseridos no banco, jamais podemos esquecer de validar os dados inseridos.&lt;/p&gt;

&lt;p&gt;Dessa forma não poluímos nosso serviço ou banco de dados com dados inválidos, vazios ou sem sentido a respeito das regras de negócios da nossa aplicação.&lt;/p&gt;

&lt;p&gt;Para isso podemos validar cada campo com os parametros necessários. Por exemplo, o campo "Nome" não pode ter menos de 3 caracteres.&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Erro: o nome deve ter pelo menos 3 caracteres.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora imagine que você tem os campos: nome, idade, peso, altura. &lt;br&gt;
Ainda assim é possivel validar, ainda que dê mais trabalho, aplicando as regras de negócio, imagine que um cadastro &lt;strong&gt;NÃO&lt;/strong&gt; pode ser efetuado sem nome e idade, em hipótese alguma.&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="c1"&gt;//validação nome&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;nome&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Erro: o nome é obrigatório.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Erro: o nome deve ter pelo menos 3 caracteres.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//validação idade&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;===&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Erro: a idade é obrigatória.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&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="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Erro: a idade deve estar entre 0 e 120.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ O problema
&lt;/h2&gt;

&lt;p&gt;Apenas &lt;strong&gt;2&lt;/strong&gt; campos geraram &lt;strong&gt;17&lt;/strong&gt; linhas de código, agora pense que você tem &lt;strong&gt;10&lt;/strong&gt;, &lt;strong&gt;20&lt;/strong&gt; campos a serem &lt;strong&gt;validados&lt;/strong&gt; com &lt;strong&gt;parametros diferentes&lt;/strong&gt; nesse mesmo campo, quantas linhas seriam necessárias para validar &lt;strong&gt;TODOS&lt;/strong&gt; os campos corretamente? o quanto do seu &lt;strong&gt;TEMPO&lt;/strong&gt; seria necessário para resolver esse problema? outras pessoas seriam capazes de mexer nesse bloco de código caso você não pudesse? &lt;strong&gt;e para dar manutenção nesse tipo validação, ficaria legível&lt;/strong&gt;? &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftkm5wu4afbo18hn72cik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftkm5wu4afbo18hn72cik.png" alt="dev estressado" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A resposta é &lt;strong&gt;NÃO&lt;/strong&gt;, o código se tornaria extenso, de difícil leitura e manutenção, transformando uma tarefa simples em algo trabalhoso e sujeito a erros. Além disso, um desenvolvedor deve solucionar um problema e não criar outros 4!&lt;/p&gt;
&lt;h2&gt;
  
  
  ✅ A solução
&lt;/h2&gt;

&lt;p&gt;Para isso, podemos utilizar a biblioteca Yup para nos ajudar. A &lt;code&gt;Yup&lt;/code&gt; é uma biblioteca javascript poderosa e intuitiva quando falamos em validação de dados e formulários, ela ajuda a garantir que os dados estejam no formato correto, com tipos certos, campos obrigatórios, e regras personalizadas.&lt;/p&gt;
&lt;h3&gt;
  
  
  📦 Instalação
&lt;/h3&gt;

&lt;p&gt;npm: &lt;code&gt;npm install yup&lt;/code&gt;&lt;br&gt;
yarn: &lt;code&gt;yarn add yup&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Caso exemplo
&lt;/h3&gt;

&lt;p&gt;Temos que fazer um POST dentro de um banco de dados com uma API em Typescript, sabendo disso, podemos criar uma Interface para modelar como os dados devem ser enviados e utilizar a &lt;code&gt;Yup&lt;/code&gt; para validar.&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;Router&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;Express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// Router&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;yup&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;yup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//importando a biblioteca após instalar&lt;/span&gt;

&lt;span class="c1"&gt;// interface &lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ICarro&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nx"&gt;ano&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="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nx"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nx"&gt;placa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
   &lt;span class="nx"&gt;modificacao&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// schema da yup para validação&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyValidation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ObjectSchema&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ICarro&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Digite o modelo do carro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

  &lt;span class="na"&gt;ano&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1886&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ano inválido&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="c1"&gt;// o primeiro carro foi em 1886&lt;/span&gt;

  &lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Digite a cor do carro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

  &lt;span class="na"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Digite a fabricante do carro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

  &lt;span class="na"&gt;placa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A placa é obrigatória&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="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;]{3}&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;\d{4}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Placa no formato inválido (ex: ABC-1234)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="c1"&gt;//regex para o padrão de placa brasileira&lt;/span&gt;

  &lt;span class="na"&gt;modificacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;//modificacao é um array de string opcional&lt;/span&gt;

&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Metodo que faz o POST, o body da requisição recebe a interface&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;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nx"&gt;ICarro&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&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="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;validatedData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ICarro&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;validatedData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bodyValidation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// validação acima&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// mostra o body da requisição&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;validatedData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="c1"&gt;// envia uma responsa json da validatedData (linha acima)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;yupErr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;yup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ValidationError&lt;/span&gt; 
        &lt;span class="c1"&gt;// em caso de erro, a yup tem tratamento de erros próprio&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Erro: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yupErr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// mensagem de erro&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;//Rota&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/carros&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplos de body&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="c1"&gt;// ✅ Esse objeto passaria na validação&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Civic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ano&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prata&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Honda&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;placa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ABC-1234&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;modificacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;turbo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rodas esportivas&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="c1"&gt;// ❌ Esse objeto NÃO passaria na validação&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fusca&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// model errado, deveria ser modelo&lt;/span&gt;
  &lt;span class="na"&gt;ano&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ano inválido&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// cor vazia&lt;/span&gt;
  &lt;span class="na"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Volkswagen&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;placa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;123-ABCD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// placa em formato inválido&lt;/span&gt;
  &lt;span class="na"&gt;modificacao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// contém string vazia e um número (o schema espera só strings)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💻 Conclusão
&lt;/h2&gt;

&lt;p&gt;Dessa forma, podemos realizar a validação dos campos com muito mais eficiência, velocidade e práticidade. A &lt;code&gt;yup&lt;/code&gt; permite que tenhamos um código bem mais limpo e organizado, habilidade essencial para um bom desenvolvedor.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 O que aprendemos?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Boas práticas ao lidar com validações&lt;/li&gt;
&lt;li&gt;Utilizar a Biblioteca Yup&lt;/li&gt;
&lt;li&gt;Implementar a biblioteca Yup em método de API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎓 Referêcias
&lt;/h2&gt;

&lt;p&gt;A biblioteca da &lt;code&gt;yup&lt;/code&gt; é muito completa, entre na documentação e aprofunde seus conhecimentos&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/yup" rel="noopener noreferrer"&gt;NPM&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/jquense/yup" rel="noopener noreferrer"&gt;github/yup&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Autor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Matheus Patricio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Onde me achar?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/matheuspatriciof/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Matheus-Patricio-dev" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://matheus-patricio.vercel.app/" rel="noopener noreferrer"&gt;portfólio&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🙏 Agradecimentos
&lt;/h2&gt;

&lt;p&gt;Se você ficou até aqui, agradeço de coração.&lt;br&gt;
Até mais!&lt;/p&gt;

</description>
      <category>yup</category>
      <category>node</category>
      <category>nextjs</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Variaveis de Ambiente em Node.js (.env)</title>
      <dc:creator>Matheus Patricio </dc:creator>
      <pubDate>Mon, 14 Apr 2025 16:32:17 +0000</pubDate>
      <link>https://dev.to/matheuspatriciodev/variaveis-de-ambiente-em-nodejs-env-5e3b</link>
      <guid>https://dev.to/matheuspatriciodev/variaveis-de-ambiente-em-nodejs-env-5e3b</guid>
      <description>&lt;p&gt;Quando desenvolvemos alguma aplicação backend, precisamos tomar cuidado ao lidar com &lt;strong&gt;informações sensíveis&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Informações como URL de conexão de banco de dados, senha do banco, chaves secretas, tokens e entre outras variáveis, se expostas podem gerar falhas de segurança críticas em nossa aplicação.&lt;/p&gt;

&lt;p&gt;Para solucionar esse problema de exposição, podemos armazenar essas informações em &lt;strong&gt;variáveis de ambiente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjn6psxhf6q17hv4ygs2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjn6psxhf6q17hv4ygs2g.png" alt="developer" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando variável de ambiente em NodeJS
&lt;/h2&gt;

&lt;p&gt;Para criar uma variável de ambiente, crie um arquivo na pasta raiz do seu projeto/aplicação com o nome de &lt;code&gt;.env&lt;/code&gt;. Esse arquivo será responsável por guardar aquelas informações sensíveis e &lt;strong&gt;NÃO&lt;/strong&gt; deve ser versionado.&lt;/p&gt;

&lt;p&gt;exemplo de como o &lt;code&gt;.env&lt;/code&gt; deve ficar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_NAME=Meu app

SECRET_API=

# Servidor
PORT=3000

# Banco de dados
DB_NAME=seuBanco
DB_PASS=suaSenha
DB_HOST=localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir desse arquivo podemos ter noção de algumas regras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A estrutura é CHAVE=VALOR&lt;/li&gt;
&lt;li&gt;A chave é em caixa alta por padrão e em SNAKE_CASE&lt;/li&gt;
&lt;li&gt;Todo valor retornado sempre será string, independente do tipo digitado&lt;/li&gt;
&lt;li&gt;Uma chave pode ser vazia, e retorna uma string vazia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que adicionamos as informações secretas dentro do nosso arquivo &lt;code&gt;.env&lt;/code&gt; precisamos adicionar o pacote &lt;code&gt;dotenv&lt;/code&gt; ao nosso projeto para que possamos gerenciar as variáveis de ambiente dentro do projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação do pacote dotenv
&lt;/h3&gt;

&lt;p&gt;usando npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install dotenv 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;usando yarn:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Em seguida inicializamos o pacote para que ele leia o arquivo &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 plaintext"&gt;&lt;code&gt;import 'dotenv/config';
// ou então
import dotenv from 'dotenv';
dotenv.config();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora usaremos a ferramenta &lt;code&gt;process.env&lt;/code&gt;, nativa do &lt;strong&gt;node&lt;/strong&gt;, para substituir os valores no local de cada chave adicionada ao &lt;code&gt;.env&lt;/code&gt;. Utilizando &lt;code&gt;process.env.[NOME_DA_CHAVE]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemplo com a porta do servidor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import express from 'express'
// Servidor

const server = express()

server.listen(process.env.PORT, () =&amp;gt; {
    console.log("Servidor rodando!")
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Boas práticas
&lt;/h3&gt;

&lt;p&gt;Importante relembrar que o arquivo &lt;code&gt;.env&lt;/code&gt; &lt;em&gt;NÂO&lt;/em&gt; deve ser versionado, portanto se for subir o código no &lt;strong&gt;github&lt;/strong&gt;, lembre-se de adicionar o arquivo ao &lt;strong&gt;gitignore&lt;/strong&gt; para ele não enviar o arquivo para o seu repositório.&lt;/p&gt;

&lt;p&gt;Outra boa prática, é criar um arquivo de exemplo com as chaves sem os valores sensiveis, assim quem clonar seu repositório não ficará perdido.&lt;/p&gt;

&lt;p&gt;Eu crio um arquivo &lt;code&gt;.env.example&lt;/code&gt; com apenas chaves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agradecimentos
&lt;/h3&gt;

&lt;p&gt;Se você ficou até aqui, agradeço de coração.&lt;br&gt;
Até mais!&lt;/p&gt;

&lt;h3&gt;
  
  
  Referencias
&lt;/h3&gt;

&lt;p&gt;Fique a vontade para ler as documentações e aprofundar seus conhecimentos!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/motdotla/dotenv/tree/228c7b449dd9adfa93447ba74c8bf894db3068e5" rel="noopener noreferrer"&gt;dotenv repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv - npm&lt;/a&gt;&lt;br&gt;
&lt;a href="https://nodejs.org/docs/latest/api/process.html" rel="noopener noreferrer"&gt;Node process docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>beginners</category>
      <category>programming</category>
      <category>dotenv</category>
    </item>
  </channel>
</rss>
