Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 24 – API JavaScript, Node.js e Express – Event Loop Deep Dive – Como Node.js funciona

Imagem destacada da aula de API

Introdução (3 min)

Imagine um garçom em um restaurante movimentado. Ele recebe pedidos das mesas, os entrega para a cozinha e, enquanto espera os pratos ficarem prontos, atende outros clientes, tira dúvidas e limpa mesas. Ele não fica parado esperando um prato ficar pronto antes de atender outro cliente. Essa é a essência do Event Loop.

Compreender o Event Loop é absolutamente essencial para construir APIs modernas e performáticas com Node.js. Ele é o coração da arquitetura não bloqueante do Node, permitindo que ele lide com múltiplas requisições simultaneamente sem travar.

Nesta aula, você vai aprender o que é o Event Loop, como ele funciona, e como usá-lo para criar aplicações Node.js eficientes. Você também verá exemplos práticos e um exercício para solidificar seu aprendizado.

No contexto do ecossistema Node.js/Express, o Event Loop é a base que possibilita o desenvolvimento de aplicações web escaláveis e responsivas, capazes de atender a milhares de usuários concorrentes.

Conceito Fundamental (7 min)

O Event Loop é um mecanismo que monitora constantemente a fila de eventos (Event Queue) e a pilha de chamadas (Call Stack). Quando a pilha de chamadas está vazia, o Event Loop pega o primeiro evento da fila e o executa.

A fila de eventos armazena as tarefas assíncronas, como leitura de arquivos, requisições de rede e timers (setTimeout, setInterval). A pilha de chamadas guarda as funções que estão sendo executadas no momento.

Um caso de uso real em produção é o processamento de requisições HTTP em um servidor web. Enquanto uma requisição está aguardando a resposta de um banco de dados, o Event Loop pode processar outras requisições, evitando gargalos e melhorando a performance.

O Event Loop se integra com outras tecnologias assíncronas, como Promises e Async/Await, facilitando o desenvolvimento de código assíncrono mais legível e manutenível.

Vantagens: Alta performance, escalabilidade, ideal para aplicações I/O-bound.

Desvantagens: Pode ser complexo de debugar em cenários com código assíncrono aninhado.

Implementação Prática (10 min)

// Servidor básico com Express.js
const express = require('express');
const app = express();
const port = 3000;

// Middleware para logging (boa prática enterprise) app.use((req, res, next) => { console.log(Requisição recebida: ${req.method} ${req.url}); next(); });

app.get('/', (req, res) => { res.send('Olá, Event Loop!'); });

// Simulando uma operação assíncrona (leitura de arquivo, por exemplo) app.get('/async', (req, res) => { setTimeout(() => { res.send('Resposta assíncrona após 2 segundos.'); }, 2000); // Simula um delay de 2 segundos

});

// Error handling robusto app.use((err, req, res, next) => { console.error(err.stack); // Log do erro com stack trace res.status(500).send('Erro interno do servidor.'); });

app.listen(port, () => { console.log(Servidor rodando na porta ${port}); });


Para rodar o código:

📚 Informações da Aula

Curso: API Completo - Node.js & Express

Tempo estimado: 25 minutos

Pré-requisitos: JavaScript básico

node seu_arquivo.js

Este código demonstra como o Event Loop lida com requisições síncronas e assíncronas. A rota / responde imediatamente, enquanto a rota /async simula uma operação assíncrona com setTimeout. O Event Loop permite que o servidor continue processando outras requisições enquanto aguarda o setTimeout completar.

Configurações como a porta 3000 são compatíveis com o HostGator Plano M. O logging e o error handling demonstram boas práticas enterprise.

Exercício Hands-On (5 min)

Crie uma nova rota /delayed que utiliza setTimeout com um delay de 5 segundos. Dentro do setTimeout, acesse um array com 5 elementos e imprima cada elemento no console com um intervalo de 1 segundo entre cada impressão, usando outro setTimeout aninhado.

Solução:

app.get('/delayed', (req, res) => {
  setTimeout(() => {
    const dados = [1, 2, 3, 4, 5];
    let i = 0;
    const intervalo = setInterval(() => {
      if (i < dados.length) {
        console.log(dados[i]);
        i++;
      } else {
        clearInterval(intervalo);
        res.send('Dados processados com delay.');
      }
    }, 1000);
  }, 5000);
});

Para testar, acesse a rota /delayed no seu navegador. Observe os logs no console do seu servidor. Você verá que o servidor responde imediatamente à requisição inicial, enquanto o processamento dos dados ocorre em background graças ao Event Loop.

Troubleshooting: Certifique-se de que você parou e reiniciou o servidor após adicionar o novo código. Verifique se o setInterval está sendo limpo com clearInterval para evitar vazamentos de memória.

Próximos Passos: Explore o uso de Promises e Async/Await para simplificar o código assíncrono e melhorar a legibilidade.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas