DEV Community

Dev Doido
Dev Doido

Posted on

Node.js pra leigos - MongoDB e Fastify

O que é Node.js?

Node.js, uma plataforma construída sobre o motor de JavaScript V8 do Google Chrome, revolucionou o desenvolvimento backend nos últimos anos. Antes do advento do Node.js, JavaScript era conhecido principalmente como uma linguagem de script executada no navegador. No entanto, com a criação do Node.js por Ryan Dahl em 2009, JavaScript ganhou um novo propósito, permitindo que desenvolvedores criassem aplicações de alta performance no lado do servidor.

JavaScript Fora do Navegador

A ideia de usar JavaScript fora do navegador não era completamente nova, mas foi o Node.js que realmente popularizou essa abordagem. O motor V8, desenvolvido pelo Google, é incrivelmente rápido na execução de código JavaScript. Ao empacotar esse motor em um ambiente standalone, Node.js trouxe a velocidade e a eficiência do V8 para o desenvolvimento backend. Isso permitiu que os desenvolvedores escrevessem código JavaScript que pudesse ser executado diretamente no servidor, sem a necessidade de um navegador.

A Filosofia do Node.js

Uma das filosofias centrais do Node.js é a sua arquitetura orientada a eventos e não bloqueante. Em muitos servidores tradicionais, como aqueles construídos com PHP ou Ruby on Rails, cada solicitação de cliente pode bloquear o servidor enquanto espera por operações de I/O, como leitura de arquivos ou consulta a bancos de dados. Isso pode levar a gargalos de performance, especialmente sob alta carga.

Node.js, em contraste, usa um loop de eventos assíncrono que permite ao servidor continuar processando outras solicitações enquanto aguarda a conclusão de operações de I/O. Isso resulta em um servidor altamente escalável e eficiente, capaz de lidar com milhares de conexões simultâneas sem perda significativa de performance. É essa capacidade de lidar com operações de I/O de maneira eficiente que torna o Node.js uma escolha popular para aplicações em tempo real, como chat rooms e jogos online.

O Ecossistema do Node.js

Outro aspecto que contribuiu para o sucesso do Node.js é seu vasto ecossistema de pacotes e módulos. O Node Package Manager (npm) é o maior repositório de bibliotecas de software do mundo, com milhões de pacotes disponíveis que podem ser facilmente integrados em projetos Node.js. Desde bibliotecas para manipulação de dados até frameworks completos para desenvolvimento web, o npm oferece uma infinidade de ferramentas que facilitam a vida dos desenvolvedores.

Fastify e MongoDB

Neste livro, vamos focar em dois componentes principais que complementarão nossa jornada com Node.js: o framework Fastify e o banco de dados MongoDB.

Fastify é um framework web para Node.js que se destaca pela sua alta performance e baixo overhead. Criado para ser uma alternativa rápida e eficiente ao Express.js, o Fastify oferece uma série de funcionalidades que facilitam o desenvolvimento de aplicações web robustas e escaláveis.

MongoDB, por outro lado, é um banco de dados NoSQL orientado a documentos que permite armazenar dados em um formato flexível, semelhante a JSON. Sua capacidade de lidar com grandes volumes de dados não estruturados e sua facilidade de integração com aplicações Node.js o tornam uma escolha popular entre desenvolvedores.

O Caminho à Frente

Nos próximos capítulos, exploraremos detalhadamente como construir aplicações completas com Node.js, utilizando Fastify para o desenvolvimento backend e MongoDB para armazenamento de dados. Vamos começar com a configuração do ambiente de desenvolvimento, passando pela criação de APIs RESTful, até chegarmos a tópicos mais avançados como autenticação, autorização e deployment.

Prepare-se para mergulhar fundo no mundo do desenvolvimento backend com Node.js. Este é apenas o começo de uma jornada que promete transformar a maneira como você constrói e pensa sobre aplicações web. Vamos juntos descobrir as infinitas possibilidades que o Node.js, o Fastify e o MongoDB têm a oferecer.

Por que escolher Node.js?

Você pode estar se perguntando por que deveria considerar o uso de Node.js para seus projetos, especialmente quando existem outras tecnologias maduras e robustas no mercado. A resposta a essa pergunta reside em vários fatores que tornam o Node.js uma plataforma extremamente atraente.

1. Alta Performance

Uma das maiores vantagens do Node.js é sua alta performance. Isso se deve ao uso do motor V8 do Google, que compila código JavaScript diretamente para código de máquina. Isso significa que o JavaScript executa extremamente rápido. Além disso, o Node.js é assíncrono e orientado a eventos, o que permite que ele lide com várias operações I/O (entrada e saída) simultaneamente sem bloquear o thread principal.

2. Escalabilidade

Node.js é altamente escalável. Graças ao seu modelo assíncrono, ele pode gerenciar um grande número de conexões simultâneas com um único servidor. Isso é particularmente útil para aplicações que exigem alta escalabilidade, como sistemas de bate-papo em tempo real, jogos multiplayer, e plataformas de streaming.

3. Ecossistema Rico

O ecossistema do Node.js é vasto e em constante crescimento. O Node Package Manager (NPM) é o maior repositório de bibliotecas de software do mundo, oferecendo uma vasta gama de pacotes que você pode integrar facilmente em seus projetos. Isso não só acelera o desenvolvimento, como também facilita a manutenção e a adição de novas funcionalidades.

4. Comunidade Vibrante

A comunidade Node.js é uma das mais ativas e colaborativas. Há uma abundância de recursos educacionais, fóruns de discussão, e eventos comunitários que você pode aproveitar. Além disso, a comunidade frequentemente contribui para o desenvolvimento do próprio Node.js, o que significa que a plataforma está sempre melhorando e se adaptando às novas demandas do mercado.

5. JavaScript em Toda Parte

Talvez um dos maiores atrativos do Node.js seja a possibilidade de usar JavaScript tanto no frontend quanto no backend. Isso não só simplifica o fluxo de trabalho dos desenvolvedores, como também permite a reutilização de código entre diferentes partes da aplicação. Esse fator pode reduzir significativamente o tempo de desenvolvimento e facilitar a manutenção do projeto.

6. Suporte para Ferramentas Modernas

Node.js não está sozinho neste jogo. Ele oferece suporte robusto para várias ferramentas modernas que podem melhorar ainda mais a produtividade e a eficiência. Por exemplo, frameworks como Fastify e bibliotecas como Mongoose para MongoDB são apenas alguns dos muitos recursos que funcionam bem com Node.js.

7. Aplicações Reais

Para ilustrar a eficácia do Node.js, vale a pena mencionar algumas das gigantes da tecnologia que a utilizam. Empresas como Netflix, LinkedIn, e Walmart adotaram Node.js para melhorar a performance de suas aplicações e reduzir tempos de resposta. Essas histórias de sucesso fornecem uma prova concreta de que Node.js não é apenas uma moda passageira, mas uma tecnologia madura e confiável.

O Que Vem a Seguir

Agora que você tem uma compreensão básica do que é Node.js e por que ele é uma escolha popular, é hora de mergulhar nas ferramentas específicas que usaremos ao longo deste livro. No próximo capítulo, vamos explorar o Fastify, um framework web para Node.js que promete ser rápido e eficiente. Através de exemplos práticos e dicas úteis, você aprenderá como configurar e usar o Fastify para construir APIs robustas e escaláveis.

Mas não para por aí. Também vamos abordar como integrar o MongoDB com Node.js para armazenar e gerenciar dados de maneira eficiente. Juntos, esses componentes formarão a base para a construção de aplicações web modernas e de alto desempenho.

Então, prepare-se para uma jornada empolgante no mundo do desenvolvimento com Node.js, Fastify, e MongoDB. A aventura está apenas começando!

Capítulo 1: Introdução ao Node.js

Seção 3: Explorando o Ecossistema do Node.js

No capítulo anterior, abordamos os fundamentos do Node.js, destacando suas características principais e as vantagens de utilizá-lo em projetos modernos de desenvolvimento web. Agora, vamos adentrar no vibrante ecossistema que o Node.js oferece, preparando o terreno para mergulharmos nas ferramentas específicas que usaremos ao longo deste livro: Fastify e MongoDB.

O Node.js, com seu motor V8 altamente eficiente, tornou-se um dos ambientes de execução JavaScript mais populares. Mas o que realmente impulsiona sua adoção massiva é o seu ecossistema robusto. O NPM (Node Package Manager) é um repositório gigantesco de pacotes e módulos que podem ser facilmente integrados aos seus projetos, economizando tempo e esforço consideráveis.

3.1. NPM: O Motor do Ecossistema

O NPM não é apenas um gerenciador de pacotes; ele é o coração pulsante do desenvolvimento com Node.js. Com mais de um milhão de pacotes disponíveis, você pode encontrar soluções para quase qualquer problema que encontrar durante o desenvolvimento. Desde bibliotecas para manipulação de datas até frameworks completos para construção de servidores web, o NPM tem de tudo.

Para começar a utilizar o NPM, basta inicializar um novo projeto Node.js com o comando:

npm init
Enter fullscreen mode Exit fullscreen mode

Este comando cria um arquivo package.json, que servirá como o mapa do seu projeto, listando todas as dependências e scripts necessários. À medida que adicionamos mais pacotes ao nosso projeto, o package.json se tornará cada vez mais valioso para manter o controle de tudo.

3.2. Pacotes Essenciais para Desenvolvedores Node.js

Existem alguns pacotes que são quase obrigatórios para qualquer desenvolvedor Node.js. Vamos explorar alguns deles:

  • Express: Embora nosso foco seja o Fastify, não podemos ignorar o Express, o framework de servidor web mais popular no ecossistema Node.js. Ele é a base sobre a qual muitos outros frameworks foram construídos.

  • Lodash: Uma biblioteca utilitária que oferece dezenas de funções para manipulação de arrays, objetos, strings, etc. É um canivete suíço indispensável.

  • Mongoose: Para quem trabalha com MongoDB, o Mongoose é uma ferramenta poderosa para modelar dados e interagir com o banco de dados de forma eficiente e estruturada.

  • Jest: Um framework de teste robusto que facilita a escrita de testes unitários e de integração, essencial para garantir a qualidade do código.

3.3. Fastify: Performance e Simplicidade

Já mencionamos o Express, mas o foco deste livro será o Fastify, um framework web que combina alta performance com uma API simples e intuitiva. Desenvolvido com foco em velocidade e baixo overhead, o Fastify é ideal para aplicações que exigem alta escalabilidade.

Uma das grandes vantagens do Fastify é sua arquitetura baseada em plugins, que permite estender suas funcionalidades de maneira modular e eficiente. Ao longo dos próximos capítulos, exploraremos como configurar e utilizar o Fastify para construir servidores web poderosos e de alta performance.

3.4. MongoDB: O Banco de Dados Não Relacional

MongoDB é um banco de dados NoSQL que armazena dados em formato JSON-like, o que facilita a integração com aplicações Node.js. Sua flexibilidade e escalabilidade o tornaram uma escolha popular para desenvolvedores que precisam de um banco de dados robusto e fácil de usar.

Neste livro, vamos utilizar o Mongoose como uma camada de abstração para interagir com o MongoDB, permitindo que façamos operações complexas de maneira simples e eficiente.

3.5. Preparando o Ambiente de Desenvolvimento

Antes de mergulharmos na construção de aplicações com Fastify e MongoDB, é crucial configurar um ambiente de desenvolvimento adequado. Certifique-se de ter o Node.js e o NPM instalados em sua máquina. Além disso, recomendamos o uso de um editor de código como o Visual Studio Code, que oferece uma vasta gama de extensões úteis para desenvolvimento em Node.js.

No próximo capítulo, começaremos a construir nossa primeira aplicação utilizando Fastify. Vamos configurar nosso servidor, definir rotas básicas e explorar como o Fastify lida com requests e responses. Este será o primeiro passo em nossa jornada para dominar o desenvolvimento com Node.js, Fastify e MongoDB.

Fique atento, pois estamos apenas começando. As fundações que estamos estabelecendo agora serão cruciais para os tópicos mais avançados que abordaremos nos capítulos seguintes. Vamos juntos desvendar o poder do Node.js!

Capítulo 2: Introdução ao Fastify

Seção 1: O que é o Fastify?

No capítulo anterior, exploramos os fundamentos do Node.js e discutimos sua importância no desenvolvimento moderno de aplicações web. Agora, é hora de dar um passo adiante e nos aprofundarmos em um dos frameworks mais poderosos e eficientes para Node.js: o Fastify.

O Framework que Você Precisa Conhecer

Fastify é um framework web para Node.js altamente focado em oferecer uma performance superior e uma experiência de desenvolvimento agradável. Desenvolvido para ser rápido e leve, ele se destaca por sua capacidade de lidar com um grande número de requisições por segundo, sem comprometer a estabilidade ou a escalabilidade da aplicação.

Ao contrário de outros frameworks mais conhecidos, como Express, Fastify foi projetado com a performance em mente desde o início. Ele utiliza um engine de JSON Schema para validar e serializar dados, o que não apenas aumenta a velocidade mas também a segurança das suas aplicações.

Por que Escolher o Fastify?

A escolha do framework para um projeto pode ser determinante para o sucesso ou fracasso do mesmo. Aqui estão alguns motivos pelos quais o Fastify pode ser a escolha certa para o seu próximo projeto:

  1. Performance: Fastify é conhecido por sua capacidade de lidar com milhares de requisições por segundo. Isso o torna ideal para aplicações de alta performance que necessitam de respostas rápidas e eficientes.
  2. Modularidade: A estrutura modular do Fastify permite que você adicione apenas os plugins e funcionalidades que realmente precisa, mantendo o núcleo da aplicação leve e ágil.
  3. Validação e Serialização: Com suporte nativo para JSON Schema, o Fastify facilita a validação e serialização de dados, tornando a sua aplicação mais segura e confiável.
  4. Ecosistema Rico: Apesar de ser um framework relativamente novo, o Fastify já conta com um ecossistema robusto de plugins e uma comunidade ativa, facilitando a resolução de problemas e a adição de novas funcionalidades.

Configuração Básica do Fastify

Antes de avançarmos para exemplos mais complexos e integração com outras tecnologias, como o MongoDB, vamos começar com uma configuração básica do Fastify. A ideia é que você se familiarize com os conceitos fundamentais e a sintaxe do framework.

Primeiro, vamos instalar o Fastify via npm. Abra o terminal e execute o seguinte comando:

npm install fastify
Enter fullscreen mode Exit fullscreen mode

Depois de instalar o Fastify, crie um arquivo JavaScript para a nossa aplicação inicial, por exemplo, app.js. No interior deste arquivo, adicione o seguinte código:

const fastify = require('fastify')({ logger: true });

// Define uma rota
fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});

// Inicia o servidor
const start = async () => {
  try {
    await fastify.listen(3000);
    console.log('Servidor rodando na porta 3000');
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};
start();
Enter fullscreen mode Exit fullscreen mode

Este é um exemplo simples, mas poderoso, que ilustra como é fácil criar um servidor com o Fastify e definir rotas. A rota definida responde com um objeto JSON contendo a mensagem "hello: 'world'".

Olhando para o Futuro

Agora que você tem uma ideia básica do que é o Fastify e como começar a usá-lo, no decorrer deste capítulo, nos aprofundaremos em mais funcionalidades e técnicas avançadas que o framework oferece. Exploraremos plugins essenciais, melhores práticas para desenvolvimento e, eventualmente, integraremos o Fastify com o MongoDB para criar uma aplicação completa e funcional.

No próximo capítulo, discutiremos a importância do MongoDB no desenvolvimento de aplicações modernas e como ele se integra perfeitamente com o Fastify para criar APIs eficientes e escaláveis. Portanto, prepare-se para mergulhar em um mundo de possibilidades que transformarão a forma como você desenvolve aplicações web.

Mantenha-se atento e continue explorando conosco neste emocionante caminho do desenvolvimento com Node.js, Fastify e MongoDB.

Capítulo 2: Explorando o Fastify

Seção 2: Configurando seu Primeiro Servidor Fastify

Depois de termos abordado os fundamentos do Node.js e entendermos por que o Fastify é uma escolha excelente para o desenvolvimento de aplicações web modernas, é hora de colocar a mão na massa e configurar o nosso primeiro servidor Fastify. Vamos fazer isso passo a passo, garantindo que você compreenda cada parte do processo.

Instalando o Fastify

Antes de tudo, precisamos instalar o Fastify em nosso projeto. Supondo que você já tenha o Node.js e o npm instalados em sua máquina, o primeiro passo é criar um novo diretório para o nosso projeto e inicializá-lo com o npm.

mkdir meu-primeiro-fastify
cd meu-primeiro-fastify
npm init -y
Enter fullscreen mode Exit fullscreen mode

O comando npm init -y cria um package.json com as configurações padrão. Agora, vamos instalar o Fastify:

npm install fastify
Enter fullscreen mode Exit fullscreen mode

Inicializando o Servidor

Com o Fastify instalado, vamos criar um arquivo chamado server.js na raiz do nosso projeto. Este arquivo será o ponto de entrada do nosso servidor.

// server.js
const fastify = require('fastify')({ logger: true });

// Declare uma rota
fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});

// Run the server!
const start = async () => {
  try {
    await fastify.listen(3000);
    fastify.log.info(`Server is running at http://localhost:3000`);
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};
start();
Enter fullscreen mode Exit fullscreen mode

Vamos destrinchar o que está acontecendo nesse código:

  1. Importação e Instância do Fastify: Começamos importando o módulo Fastify e criando uma instância dele, ativando o logger para facilitar a depuração.

  2. Declaração de Rota: Definimos uma rota básica que responde ao método GET na raiz (/). Quando essa rota é acessada, o servidor responde com um objeto JSON { hello: 'world' }.

  3. Inicialização do Servidor: Criamos uma função assíncrona start que tenta iniciar o servidor na porta 3000. Se o servidor for iniciado com sucesso, ele loga a URL do servidor. Caso ocorra algum erro, o erro é logado e o processo é encerrado.

Executando o Servidor

Para executar o servidor, simplesmente rodamos o seguinte comando no terminal:

node server.js
Enter fullscreen mode Exit fullscreen mode

Se tudo estiver configurado corretamente, você verá uma mensagem no terminal indicando que o servidor está rodando e você poderá acessar http://localhost:3000 em seu navegador para ver a resposta {"hello":"world"}.

Explorando Mais Rotas e Métodos

O Fastify não se limita apenas ao método GET e rotas simples. Vamos adicionar algumas rotas adicionais e explorar diferentes métodos HTTP:

// Adicionando mais rotas no server.js

// Rota POST
fastify.post('/data', async (request, reply) => {
  return { data: request.body };
});

// Rota PUT
fastify.put('/data/:id', async (request, reply) => {
  const { id } = request.params;
  return { id, data: request.body };
});

// Rota DELETE
fastify.delete('/data/:id', async (request, reply) => {
  const { id } = request.params;
  return { status: `Data with id ${id} deleted` };
});
Enter fullscreen mode Exit fullscreen mode

Aqui, adicionamos três novas rotas para ilustrar como lidar com diferentes métodos HTTP:

  1. POST: Recebe dados no corpo da requisição e os retorna na resposta.
  2. PUT: Recebe um ID na URL e dados no corpo da requisição, retornando ambos na resposta.
  3. DELETE: Recebe um ID na URL e retorna uma mensagem indicando que os dados foram "deletados".

Próximos Passos

Nesta seção, configuramos e executamos um servidor Fastify básico e exploramos como definir rotas para diferentes métodos HTTP. No próximo capítulo, mergulharemos na integração do Fastify com o MongoDB, permitindo que nossa aplicação manipule dados persistentes de forma eficiente.

Fique atento para aprender como conectar o Fastify ao MongoDB, definir esquemas de dados, e realizar operações CRUD (Create, Read, Update, Delete) diretamente em sua base de dados. Essas habilidades serão fundamentais para construir aplicações web robustas e escaláveis.

Até lá, continue experimentando com o Fastify, adicionando novas rotas e manipulando dados de diferentes maneiras. A prática é essencial para dominar qualquer tecnologia, e o Fastify é uma ferramenta poderosa e flexível que vale a pena explorar a fundo.

Capítulo 2: Configuração Inicial do Ambiente

Seção 3: Instalando e Configurando o Fastify

No capítulo anterior, discutimos a importância de ter um ambiente Node.js bem configurado e demos os primeiros passos para garantir que você tenha todas as ferramentas necessárias à sua disposição. Agora que temos o Node.js e o npm (Node Package Manager) devidamente instalados, é hora de mergulharmos em uma das ferramentas chave que utilizaremos ao longo deste livro: o Fastify.

Fastify é um framework web para Node.js que se destaca por sua performance e simplicidade. Seu design focado em eficiência e modularidade o torna uma escolha excelente para desenvolver aplicações escaláveis e rápidas.

Instalando o Fastify

Para começar a usar o Fastify, precisamos primeiro instalá-lo em nosso projeto. Vamos iniciar criando uma nova pasta para o nosso projeto e depois instalar o Fastify via npm.

  1. Crie uma nova pasta para o seu projeto e navegue até ela:
   mkdir meu-projeto-fastify
   cd meu-projeto-fastify
Enter fullscreen mode Exit fullscreen mode
  1. Inicialize um novo projeto Node.js:
   npm init -y
Enter fullscreen mode Exit fullscreen mode

Isso cria um arquivo package.json com as configurações padrão, que servirá como o ponto central de configuração para o nosso projeto.

  1. Instale o Fastify:
   npm install fastify
Enter fullscreen mode Exit fullscreen mode

Com isso, o Fastify está instalado e pronto para ser usado em nosso projeto.

Configurando o Fastify

Agora que temos o Fastify instalado, vamos configurá-lo para criar nosso primeiro servidor. Crie um arquivo chamado server.js na raiz do seu projeto e adicione o seguinte código:

// server.js
const fastify = require('fastify')({ logger: true });

// Definindo uma rota simples
fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});

// Iniciando o servidor
const start = async () => {
  try {
    await fastify.listen(3000);
    console.log('Servidor rodando na porta 3000');
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};
start();
Enter fullscreen mode Exit fullscreen mode

Vamos analisar o que estamos fazendo aqui:

  1. Importando e inicializando o Fastify: Estamos importando o Fastify e inicializando-o com um objeto de configuração que ativa o logger, uma ferramenta útil para depuração e monitoramento.

  2. Definindo uma rota: Criamos uma rota GET na raiz (/) que retorna um simples objeto JSON com a mensagem "hello: world".

  3. Iniciando o servidor: A função start tenta iniciar o servidor na porta 3000 e, em caso de falha, loga o erro e encerra o processo.

Executando o Servidor

Para executar o servidor, basta rodar o seguinte comando no terminal:

node server.js
Enter fullscreen mode Exit fullscreen mode

Você verá uma mensagem indicando que o servidor está rodando na porta 3000. Ao acessar http://localhost:3000 no navegador, você deve ver a resposta JSON: {"hello":"world"}.

Explorando Mais Funcionalidades

Com o nosso servidor básico configurado, estamos prontos para explorar funcionalidades mais avançadas do Fastify. Nas próximas seções, abordaremos como adicionar plugins, implementar autenticação e integração com bancos de dados como o MongoDB.

Próximos Passos

Nos próximos capítulos, mergulharemos mais fundo nas capacidades do Fastify e começaremos a integrar o MongoDB para armazenar e manipular dados de forma eficiente. Também veremos como estruturar nossas aplicações para manter um código limpo e fácil de manter.

Fique atento, pois a jornada está apenas começando. Com o conhecimento que você adquiriu até agora, estará bem preparado para construir aplicações robustas e escaláveis com Node.js, Fastify e MongoDB.


No próximo capítulo, começaremos a explorar como conectar nosso servidor Fastify a um banco de dados MongoDB, permitindo que nossa aplicação armazene e recupere dados de forma eficiente. Prepare-se para descobrir como a combinação dessas tecnologias pode transformar a maneira como você desenvolve suas aplicações web.

Capítulo 3: A Magia do Fastify

Seção 1: Introdução ao Fastify

Depois de compreendermos a importância do Node.js e suas funcionalidades básicas, é hora de darmos um passo adiante e mergulhar no mundo dos frameworks. No universo do Node.js, um framework que tem ganhado destaque pela sua eficiência e simplicidade é o Fastify. Nesta seção, vamos explorar os conceitos fundamentais do Fastify, entender por que ele se tornou uma escolha popular entre desenvolvedores e como ele pode nos ajudar a construir aplicações web de alta performance e escaláveis.

O Que É o Fastify?

O Fastify é um framework web para Node.js que se destaca por ser extremamente rápido e eficiente. Criado com foco em performance, ele oferece uma experiência de desenvolvimento amigável sem sacrificar a velocidade. Ele é projetado para ser extensível, permitindo que você adicione facilmente plugins para estender suas funcionalidades conforme necessário.

Fastify é um projeto de código aberto e, desde sua criação, tem atraído uma comunidade vibrante de desenvolvedores que contribuem para seu crescimento e melhoria contínua. Sua arquitetura baseada em plugins facilita a manutenção e a escalabilidade de aplicações complexas.

Por Que Escolher o Fastify?

Existem várias razões pelas quais o Fastify pode ser a escolha ideal para o seu próximo projeto Node.js:

  1. Alta Performance: O Fastify é um dos frameworks mais rápidos disponíveis, com benchmarks mostrando que ele pode lidar com milhares de requisições por segundo.
  2. Simplicidade: A API do Fastify é simples e intuitiva, facilitando o desenvolvimento e a manutenção do código.
  3. Extensibilidade: A arquitetura de plugins do Fastify permite que você adicione funcionalidades extras de forma modular e organizada.
  4. Validação de Schemas: O Fastify vem com suporte embutido para validação de schemas usando JSON Schema, ajudando a garantir que suas rotas recebam os dados esperados.
  5. Comunidade Ativa: Como projeto de código aberto, o Fastify possui uma comunidade ativa que contribui com plugins, melhorias e suporte.

Iniciando com Fastify

Antes de começarmos a construir nossa aplicação com Fastify, precisamos instalar o framework. Vamos começar configurando um novo projeto Node.js e instalando o Fastify como dependência.

  1. Crie um Novo Projeto: No terminal, navegue até o diretório onde você deseja criar seu projeto e execute o seguinte comando para inicializar um novo projeto Node.js:
   npm init -y
Enter fullscreen mode Exit fullscreen mode
  1. Instale o Fastify: Com o projeto inicializado, instale o Fastify usando o npm:
   npm install fastify
Enter fullscreen mode Exit fullscreen mode
  1. Configure o Servidor Básico: Crie um arquivo chamado server.js e adicione o seguinte código para configurar seu primeiro servidor Fastify:
   const fastify = require('fastify')({ logger: true });

   fastify.get('/', async (request, reply) => {
     return { hello: 'world' };
   });

   const start = async () => {
     try {
       await fastify.listen(3000);
       console.log(`Server is running at http://localhost:3000`);
     } catch (err) {
       fastify.log.error(err);
       process.exit(1);
     }
   };
   start();
Enter fullscreen mode Exit fullscreen mode

Com essas etapas, você já terá um servidor Fastify básico em funcionamento. Ao acessar http://localhost:3000 no seu navegador, você verá uma mensagem simples: { hello: 'world' }.

O Futuro com Fastify e MongoDB

Agora que configuramos nosso servidor básico com Fastify, estamos prontos para explorar funcionalidades mais avançadas. Nos próximos capítulos, vamos integrar o Fastify com o MongoDB para criar uma aplicação completa e robusta, capaz de lidar com operações de banco de dados de forma eficiente.

Vamos aprender como definir rotas, lidar com requisições e respostas, e assegurar que nossos dados são validados corretamente. Além disso, exploraremos como usar plugins para adicionar autenticação, gerenciamento de sessões e outras funcionalidades essenciais para nossas aplicações.

Prepare-se para uma jornada emocionante no desenvolvimento de aplicações Node.js com Fastify e MongoDB!

Capítulo 3: Estrutura do Projeto

Seção 2: Configurando Fastify

Tendo entendido a importância de uma estrutura de projeto bem organizada, vamos agora configurar o Fastify, que será o núcleo do nosso servidor Node.js. Se você seguiu as instruções da seção anterior, você já deve ter instalado o Fastify e criado a estrutura inicial do projeto. Agora, vamos configurar o servidor e preparar o terreno para futuras implementações.

Inicializando o Fastify

Primeiramente, crie um arquivo chamado server.js na raiz do seu projeto. Este arquivo será o ponto de entrada do nosso servidor. Abra o arquivo e adicione o seguinte código:

const fastify = require('fastify')({ logger: true });

fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});

const start = async () => {
  try {
    await fastify.listen(3000);
    console.log(`Server is running at http://localhost:3000`);
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();
Enter fullscreen mode Exit fullscreen mode

Este código basicamente configura um servidor Fastify que responde com uma mensagem "hello: 'world'" quando você acessa a raiz do servidor, ou seja, http://localhost:3000.

Entendendo o Código

Vamos analisar o código acima em mais detalhes:

  1. Importação do Fastify:
   const fastify = require('fastify')({ logger: true });
Enter fullscreen mode Exit fullscreen mode

Aqui, estamos importando o Fastify e inicializando-o com um objeto de configuração que habilita o logger. O logger é extremamente útil para debugging e monitoramento, pois permite que você veja as requisições sendo registradas no console.

  1. Definição de uma Rota:
   fastify.get('/', async (request, reply) => {
     return { hello: 'world' };
   });
Enter fullscreen mode Exit fullscreen mode

Definimos uma rota GET para a raiz (/) do nosso servidor. Quando alguém faz uma requisição para esta rota, a função assíncrona é executada e retorna um objeto JSON com a mensagem "hello: 'world'".

  1. Inicialização do Servidor:
   const start = async () => {
     try {
       await fastify.listen(3000);
       console.log(`Server is running at http://localhost:3000`);
     } catch (err) {
       fastify.log.error(err);
       process.exit(1);
     }
   };
   start();
Enter fullscreen mode Exit fullscreen mode

A função start é responsável por iniciar o servidor. Utilizamos await fastify.listen(3000) para que o servidor comece a escutar na porta 3000. Se ocorrer algum erro, ele será registrado no log e o processo será encerrado com process.exit(1).

Ambiente de Desenvolvimento

Para facilitar o desenvolvimento, é recomendável usar uma ferramenta como o nodemon. O nodemon reinicia automaticamente o servidor sempre que detecta mudanças nos arquivos do projeto.

Para instalar o nodemon, execute:

npm install -g nodemon
Enter fullscreen mode Exit fullscreen mode

Depois, modifique o seu package.json para incluir um script de desenvolvimento:

"scripts": {
  "start": "node server.js",
  "dev": "nodemon server.js"
}
Enter fullscreen mode Exit fullscreen mode

Agora, você pode iniciar seu servidor em modo de desenvolvimento com:

npm run dev
Enter fullscreen mode Exit fullscreen mode

Preparando o Terreno para MongoDB

Agora que temos nosso servidor Fastify configurado e rodando, o próximo passo será integrar o MongoDB. No próximo capítulo, vamos explorar como configurar o MongoDB, criar um banco de dados, e conectar nosso servidor Fastify a esse banco de dados para armazenar e recuperar dados.

Essa integração será fundamental para construir aplicações mais complexas e dinâmicas, onde a persistência de dados é essencial. Então, prepare-se para mergulhar no mundo do MongoDB e aprender como essas ferramentas poderosas podem trabalhar juntas para criar aplicações robustas e escaláveis.

Continue lendo para descobrir como configurar o MongoDB, conectar-se a ele a partir do Fastify e começar a manipular dados de forma eficiente e segura. Estamos apenas começando!

Capítulo 3: Estruturando a Aplicação

Seção 3: Definindo Rotas e Controladores

Na seção anterior, discutimos a configuração inicial do ambiente de desenvolvimento utilizando Node.js, Fastify e MongoDB. Com nosso ambiente pronto, é hora de avançarmos para a definição das rotas e controladores da nossa aplicação. Esta etapa é crucial, pois as rotas e controladores são a espinha dorsal das interações entre o cliente e o servidor.

Criação das Primeiras Rotas

No Fastify, as rotas são definidas de maneira bastante intuitiva. Vamos começar criando uma rota simples para verificar se nosso servidor está funcionando corretamente. No arquivo server.js que configuramos anteriormente, adicione o seguinte código:

fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});
Enter fullscreen mode Exit fullscreen mode

Aqui, estamos definindo uma rota GET para o caminho raiz (/). Quando um cliente fizer uma requisição para esta rota, o servidor responderá com um objeto JSON contendo a mensagem "hello: 'world'".

Separando as Rotas em Módulos

Para manter nosso projeto organizado, é uma boa prática separar as rotas em módulos. Crie uma pasta chamada routes na raiz do seu projeto e, dentro dela, um arquivo chamado index.js. Vamos mover nossa rota para este novo arquivo:

// routes/index.js
async function routes(fastify, options) {
  fastify.get('/', async (request, reply) => {
    return { hello: 'world' };
  });
}

module.exports = routes;
Enter fullscreen mode Exit fullscreen mode

Agora, precisamos registrar este módulo de rotas no nosso arquivo principal server.js:

// server.js
const fastify = require('fastify')({ logger: true });
const routes = require('./routes/index');

fastify.register(routes);

const start = async () => {
  try {
    await fastify.listen(3000);
    fastify.log.info(`Server listening on ${fastify.server.address().port}`);
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};
start();
Enter fullscreen mode Exit fullscreen mode

Introdução aos Controladores

Os controladores são responsáveis por lidar com a lógica de negócio da aplicação. Eles recebem as requisições, processam os dados e retornam a resposta adequada. Vamos criar uma estrutura básica para nossos controladores.

Crie uma pasta chamada controllers na raiz do projeto e, dentro dela, um arquivo chamado helloController.js:

// controllers/helloController.js
const helloWorld = async (request, reply) => {
  return { hello: 'world' };
};

module.exports = {
  helloWorld,
};
Enter fullscreen mode Exit fullscreen mode

Agora, vamos atualizar nosso módulo de rotas para utilizar este controlador:

// routes/index.js
const helloController = require('../controllers/helloController');

async function routes(fastify, options) {
  fastify.get('/', helloController.helloWorld);
}

module.exports = routes;
Enter fullscreen mode Exit fullscreen mode

Rota para Criar um Novo Usuário

Vamos adicionar uma nova rota para criar um usuário. Primeiro, defina um controlador para lidar com a criação do usuário:

// controllers/userController.js
const createUser = async (request, reply) => {
  const { name, email } = request.body;
  // Aqui, adicionaremos a lógica para salvar o usuário no MongoDB.
  return { message: 'Usuário criado com sucesso', user: { name, email } };
};

module.exports = {
  createUser,
};
Enter fullscreen mode Exit fullscreen mode

Em seguida, adicione a rota correspondente no nosso módulo de rotas:

// routes/index.js
const helloController = require('../controllers/helloController');
const userController = require('../controllers/userController');

async function routes(fastify, options) {
  fastify.get('/', helloController.helloWorld);
  fastify.post('/users', userController.createUser);
}

module.exports = routes;
Enter fullscreen mode Exit fullscreen mode

Conectando ao MongoDB

Para salvar os usuários no MongoDB, precisamos configurar a conexão com o banco de dados. Vamos utilizar o pacote mongoose para interagir com o MongoDB. Instale-o com o seguinte comando:

npm install mongoose
Enter fullscreen mode Exit fullscreen mode

Em seguida, configure a conexão no server.js:

// server.js
const fastify = require('fastify')({ logger: true });
const mongoose = require('mongoose');
const routes = require('./routes/index');

mongoose.connect('mongodb://localhost:27017/devdoido', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

fastify.register(routes);

const start = async () => {
  try {
    await fastify.listen(3000);
    fastify.log.info(`Server listening on ${fastify.server.address().port}`);
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};
start();
Enter fullscreen mode Exit fullscreen mode

Modelos do Mongoose

Para interagir com o MongoDB, precisamos definir modelos que representam as coleções do banco de dados. Vamos criar um modelo para o usuário. Crie uma pasta chamada models e, dentro dela, um arquivo userModel.js:

// models/userModel.js
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
});

const User = mongoose.model('User', userSchema);

module.exports = User;
Enter fullscreen mode Exit fullscreen mode

Atualize o controlador do usuário para utilizar este modelo:

// controllers/userController.js
const User = require('../models/userModel');

const createUser = async (request, reply) => {
  const { name, email } = request.body;
  const user = new User({ name, email });
  await user.save();
  return { message: 'Usuário criado com sucesso', user };
};

module.exports = {
  createUser,
};
Enter fullscreen mode Exit fullscreen mode

Próximos Passos

Com as rotas e controladores básicos configurados, estamos prontos para adicionar mais funcionalidades à nossa aplicação. No próximo capítulo, vamos explorar como implementar autenticação e autorização, garantindo que apenas usuários autenticados possam acessar determinadas rotas. Também discutiremos como lidar com erros e validações para tornar nossa aplicação mais robusta e segura.

Fique atento, pois estamos apenas começando nossa jornada com Node.js, Fastify e MongoDB. Muitas outras funcionalidades interessantes estão por vir, e você não vai querer perder nenhum detalhe!

Capítulo 4: Manipulando Dados com MongoDB

Seção 1: Introdução ao MongoDB e sua Integração com Node.js

Na última seção, exploramos como configurar o Fastify para criar um servidor HTTP robusto e eficiente. Agora, vamos dar um passo adiante e abordar uma das funcionalidades mais cruciais de qualquer aplicação web moderna: o gerenciamento de dados. Para isso, utilizaremos o MongoDB, um banco de dados NoSQL que se integra perfeitamente com o Node.js.

Por que MongoDB?

Antes de mergulharmos na implementação, é importante entender por que escolhemos o MongoDB como nosso banco de dados. MongoDB é um banco de dados orientado a documentos que armazena dados no formato BSON (uma extensão binária do JSON). Isso traz várias vantagens:

  1. Flexibilidade do Esquema: Ao contrário dos bancos de dados relacionais, o MongoDB permite que diferentes documentos em uma mesma coleção tenham estruturas diferentes. Isso é especialmente útil em ambientes de desenvolvimento ágeis, onde os requisitos de dados podem mudar rapidamente.

  2. Escalabilidade Horizontal: MongoDB foi projetado para escalar de forma horizontal, o que significa que você pode adicionar mais servidores para lidar com o aumento de carga e volume de dados.

  3. Alto Desempenho: Graças ao seu formato de armazenamento e índice, o MongoDB geralmente oferece um desempenho superior para operações de leitura e escrita em comparação com bancos de dados relacionais tradicionais.

Instalando e Configurando o MongoDB

Para começar a usar o MongoDB com Node.js, primeiro precisamos instalar o MongoDB. Dependendo do seu sistema operacional, o processo de instalação pode variar. Aqui, vamos abordar a instalação em um ambiente Unix-based (Linux ou macOS).

  1. Instalação no Linux:
   wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
   sudo apt-get install -y mongodb-org
Enter fullscreen mode Exit fullscreen mode
  1. Instalação no macOS:
   brew tap mongodb/brew
   brew install mongodb-community@4.4
Enter fullscreen mode Exit fullscreen mode

Após a instalação, podemos iniciar o serviço MongoDB com o comando:

sudo systemctl start mongod
Enter fullscreen mode Exit fullscreen mode

ou, no macOS:

brew services start mongodb/brew/mongodb-community
Enter fullscreen mode Exit fullscreen mode

Conectando o MongoDB com Node.js

Com o MongoDB instalado e em execução, o próximo passo é integrá-lo à nossa aplicação Node.js. Para isso, utilizaremos o pacote mongodb disponível no npm.

Primeiro, precisamos instalar o pacote:

npm install mongodb
Enter fullscreen mode Exit fullscreen mode

Agora, vamos criar um arquivo de configuração para gerenciar a conexão com o MongoDB. Crie um novo arquivo chamado db.js na raiz do seu projeto e adicione o seguinte código:

const { MongoClient } = require('mongodb');

const url = 'mongodb://localhost:27017';
const dbName = 'devdoidoDB';

let db;

async function connectToDatabase() {
    const client = new MongoClient(url, { useNewUrlParser: true, useUnifiedTopology: true });
    await client.connect();
    db = client.db(dbName);
    console.log('Conectado ao banco de dados MongoDB');
}

function getDb() {
    if (!db) {
        throw new Error('Banco de dados não conectado!');
    }
    return db;
}

module.exports = { connectToDatabase, getDb };
Enter fullscreen mode Exit fullscreen mode

Integrando MongoDB com Fastify

Com a nossa conexão configurada, o próximo passo é integrar o MongoDB com o Fastify. Atualize o arquivo server.js para incluir a conexão com o banco de dados antes de iniciar o servidor Fastify:

const fastify = require('fastify')({ logger: true });
const { connectToDatabase } = require('./db');

async function start() {
    try {
        await connectToDatabase();
        await fastify.listen(3000);
        fastify.log.info(`Servidor rodando na porta 3000`);
    } catch (err) {
        fastify.log.error(err);
        process.exit(1);
    }
}

start();
Enter fullscreen mode Exit fullscreen mode

Próximos Passos

Agora que configuramos a conexão com o MongoDB e integramos com o Fastify, estamos prontos para começar a manipular dados. No entanto, isso é apenas o começo. Na próxima seção, exploraremos como criar, ler, atualizar e deletar (CRUD) documentos no MongoDB, utilizando o Fastify como nosso intermediário.

Fique atento, pois também discutiremos práticas recomendadas para modelagem de dados e como otimizar consultas para garantir que nossa aplicação continue performando bem à medida que cresce. Vamos juntos nessa jornada para dominar o desenvolvimento full-stack com Node.js, Fastify e MongoDB!

Capítulo 4: Construindo a Base do Nosso Projeto

Seção 2: Configurando o Ambiente de Desenvolvimento

No capítulo anterior, discutimos a importância de escolher as ferramentas certas para o desenvolvimento de aplicações web modernas. Agora, vamos colocar a mão na massa e configurar nosso ambiente de desenvolvimento. Esta seção é crucial para garantir que todos os componentes do nosso projeto estejam alinhados e funcionando corretamente, desde o início.

2.1 Instalando o Node.js e NPM

Para começar a desenvolver com Node.js, precisamos, obviamente, do Node.js instalado em nosso sistema. O Node.js é um ambiente de execução para JavaScript construído sobre o motor JavaScript V8 do Google Chrome, permitindo que você execute código JavaScript no lado do servidor.

  1. Baixando o Node.js:

    • Acesse o site oficial do Node.js (https://nodejs.org).
    • Baixe a versão LTS (Long Term Support) para garantir maior estabilidade e suporte.
  2. Instalando o Node.js:

    • Siga as instruções de instalação que são fornecidas conforme o seu sistema operacional (Windows, macOS, Linux).
    • Durante a instalação, o NPM (Node Package Manager) será instalado automaticamente.
  3. Verificando a Instalação:

    • Abra o terminal ou o prompt de comando.
    • Execute node -v para verificar a versão do Node.js instalada.
    • Execute npm -v para verificar a versão do NPM instalada.

Com o Node.js e o NPM instalados, estamos prontos para configurar o nosso projeto.

2.2 Inicializando o Projeto com NPM

O NPM é uma ferramenta essencial para gerenciar pacotes e dependências em projetos Node.js. Vamos utilizar o NPM para inicializar nosso projeto.

  1. Criando o Diretório do Projeto:

    • No terminal, navegue até o diretório onde você deseja criar o projeto.
    • Execute mkdir nodejs-com-o-devdoido e depois cd nodejs-com-o-devdoido para criar e entrar no diretório do projeto.
  2. Inicializando o NPM:

    • No terminal, dentro do diretório do projeto, execute npm init -y.
    • Este comando cria um arquivo package.json com as configurações padrão. O arquivo package.json gerencia as dependências e metadados do projeto.

2.3 Instalando o Fastify

Fastify é um framework web rápido e eficiente para Node.js, ideal para construir aplicações web e APIs. Vamos adicionar o Fastify ao nosso projeto.

  1. Instalando o Fastify:

    • No terminal, execute npm install fastify.
  2. Verificando a Instalação:

    • Abra o arquivo package.json e verifique se o Fastify foi adicionado às dependências.

Com o Fastify instalado, podemos começar a construir a estrutura básica da nossa aplicação.

2.4 Configurando o Servidor com Fastify

Vamos criar um arquivo inicial para configurar o servidor utilizando o Fastify.

  1. Criando o Arquivo do Servidor:

    • No diretório do projeto, crie um arquivo chamado server.js.
  2. Configurando o Servidor:

    • Abra o server.js e adicione o seguinte código para configurar um servidor básico:
const fastify = require('fastify')({ logger: true });

fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});

const start = async () => {
  try {
    await fastify.listen(3000);
    console.log('Server listening on http://localhost:3000');
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();
Enter fullscreen mode Exit fullscreen mode
  1. Executando o Servidor:
    • No terminal, execute node server.js.
    • Acesse http://localhost:3000 no navegador para verificar se o servidor está rodando corretamente.

2.5 Conectando ao MongoDB

Com o servidor Fastify configurado, precisamos agora configurar a conexão com o MongoDB, um banco de dados NoSQL robusto e flexível.

  1. Instalando o Mongoose:

    • No terminal, execute npm install mongoose. O Mongoose é uma biblioteca de modelagem de dados para MongoDB e Node.js.
  2. Configurando a Conexão:

    • No server.js, adicione o código para conectar ao MongoDB:
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/nodejscomodevdoido', {
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(() => {
  console.log('MongoDB connected...');
}).catch(err => {
  console.log('Error connecting to MongoDB:', err);
});
Enter fullscreen mode Exit fullscreen mode
  1. Testando a Conexão:
    • Reinicie o servidor (Ctrl+C para parar e depois node server.js para iniciar novamente).
    • Verifique se a mensagem "MongoDB connected..." aparece no console.

O Que Vem a Seguir?

Agora que temos nosso ambiente de desenvolvimento configurado com Node.js, Fastify e MongoDB, estamos prontos para começar a construir funcionalidades mais complexas. No próximo capítulo, vamos explorar como criar rotas e manipuladores de requisição no Fastify, além de definir nossos esquemas de dados no MongoDB usando o Mongoose. Fique atento, pois entraremos nas partes mais empolgantes do desenvolvimento da nossa aplicação!

Prepare-se para aprofundar ainda mais no mundo do Node.js e descobrir como maximizar a eficiência e a escalabilidade do seu projeto.

Capítulo 4: Configurando o Ambiente

Seção 3: Conectando Fastify com MongoDB

No capítulo anterior, exploramos como configurar o Fastify e criar nossas primeiras rotas. Agora, é hora de dar um passo adiante e integrar nosso servidor Fastify com um banco de dados MongoDB. Este é um momento crucial, pois a integração com um banco de dados nos permitirá armazenar e gerenciar dados de maneira eficiente, essencial para qualquer aplicação robusta.

Antes de começarmos, é importante garantir que você tenha o MongoDB instalado e funcionando em sua máquina. Se você ainda não o fez, recomendo seguir a documentação oficial do MongoDB para instalar e configurar o banco de dados de acordo com seu sistema operacional.

Instalando Dependências

Para conectar nosso servidor Fastify ao MongoDB, vamos utilizar o pacote fastify-mongodb, que facilita essa integração. Vamos começar instalando as dependências necessárias:

npm install fastify-mongodb
Enter fullscreen mode Exit fullscreen mode

Configurando a Conexão com o MongoDB

Com as dependências instaladas, podemos configurar a conexão com o MongoDB em nosso servidor Fastify. Abra o arquivo principal do seu servidor Fastify e adicione a seguinte configuração:

const fastify = require('fastify')({ logger: true });

// Adiciona o plugin fastify-mongodb
fastify.register(require('fastify-mongodb'), {
  forceClose: true,
  url: 'mongodb://localhost:27017/mydatabase'
});

// Inicializa o servidor
fastify.listen(3000, (err, address) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
  fastify.log.info(`Servidor rodando em ${address}`);
});
Enter fullscreen mode Exit fullscreen mode

Criando o Primeiro CRUD

Agora que temos o MongoDB conectado ao nosso servidor Fastify, é hora de criar um conjunto básico de operações CRUD (Create, Read, Update, Delete). Para ilustrar isso de uma forma simples, vamos criar uma rota para gerenciar uma coleção de "usuários".

Criando um Usuário

Vamos começar criando uma rota POST para adicionar um novo usuário à nossa coleção:

fastify.post('/users', async (request, reply) => {
  const { name, email } = request.body;
  const collection = fastify.mongo.db.collection('users');
  const result = await collection.insertOne({ name, email });
  reply.send(result.ops[0]);
});
Enter fullscreen mode Exit fullscreen mode

Lendo Usuários

Em seguida, vamos criar uma rota GET para listar todos os usuários:

fastify.get('/users', async (request, reply) => {
  const collection = fastify.mongo.db.collection('users');
  const users = await collection.find().toArray();
  reply.send(users);
});
Enter fullscreen mode Exit fullscreen mode

Atualizando um Usuário

Para atualizar um usuário específico, vamos criar uma rota PUT:

fastify.put('/users/:id', async (request, reply) => {
  const { id } = request.params;
  const { name, email } = request.body;
  const collection = fastify.mongo.db.collection('users');
  const result = await collection.findOneAndUpdate(
    { _id: new fastify.mongo.ObjectId(id) },
    { $set: { name, email } },
    { returnOriginal: false }
  );
  reply.send(result.value);
});
Enter fullscreen mode Exit fullscreen mode

Deletando um Usuário

Finalmente, vamos criar uma rota DELETE para remover um usuário da coleção:

fastify.delete('/users/:id', async (request, reply) => {
  const { id } = request.params;
  const collection = fastify.mongo.db.collection('users');
  await collection.deleteOne({ _id: new fastify.mongo.ObjectId(id) });
  reply.send({ message: 'Usuário deletado com sucesso' });
});
Enter fullscreen mode Exit fullscreen mode

Conclusão e Próximos Passos

Com estas rotas básicas, agora temos uma aplicação Fastify que pode se comunicar com um banco de dados MongoDB para realizar operações CRUD. Este é um grande passo para construir uma aplicação robusta e funcional.

No próximo capítulo, vamos explorar como adicionar autenticação e autorização à nossa aplicação, garantindo que apenas usuários autenticados possam acessar certas partes do nosso sistema. Isso não só aumentará a segurança da nossa aplicação, mas também abrirá portas para a implementação de funcionalidades mais avançadas.

Fique atento e continue a jornada conosco enquanto desvendamos mais segredos do Node.js com Fastify e MongoDB!

Capítulo 5: Gerenciando Rotas no Fastify

Seção 1: Introdução às Rotas

Undefined. A transição para o capítulo cinco nos leva a um dos aspectos mais críticos e interessantes do desenvolvimento de aplicações web com Node.js: o gerenciamento de rotas. Até aqui, exploramos os fundamentos do Node.js, destacamos a eficiência e a simplicidade do Fastify, e estabelecemos uma conexão robusta com o MongoDB. Agora, é hora de entender como definir e gerenciar rotas de forma eficaz para criar uma API bem estruturada e performática.

O Que São Rotas?

No contexto de uma aplicação web, rotas são os caminhos definidos que mapeiam as requisições HTTP para funções específicas no servidor. Cada rota especifica um endpoint (um caminho de URL) e um método HTTP (GET, POST, PUT, DELETE, etc.) que o servidor deve executar quando recebe uma requisição correspondente. Por exemplo, uma requisição GET para a rota /users pode retornar uma lista de usuários, enquanto uma requisição POST para a mesma rota pode criar um novo usuário.

Por Que Fastify?

Você pode estar se perguntando por que optamos por utilizar o Fastify para gerenciar nossas rotas. A resposta é simples: performance e simplicidade. O Fastify foi projetado para ser rápido, atingindo benchmarks impressionantes em comparação com outros frameworks populares. Além disso, ele oferece uma API intuitiva e poderosa que facilita o desenvolvimento sem sacrificar a flexibilidade ou a capacidade de extensão.

Definindo Rotas no Fastify

Para começar a definir rotas em uma aplicação Fastify, primeiro precisamos iniciar uma instância do Fastify e, em seguida, utilizar o método route para especificar nossas rotas. Vamos ver um exemplo básico:

const fastify = require('fastify')({ logger: true })

fastify.route({
  method: 'GET',
  url: '/users',
  handler: async (request, reply) => {
    return { hello: 'world' }
  }
})

const start = async () => {
  try {
    await fastify.listen(3000)
    fastify.log.info(`Server listening on ${fastify.server.address().port}`)
  } catch (err) {
    fastify.log.error(err)
    process.exit(1)
  }
}
start()
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, definimos uma rota GET para o endpoint /users que simplesmente retorna um objeto JSON com a mensagem "hello: 'world'". Embora este exemplo seja bastante simples, ele ilustra a estrutura básica de uma rota no Fastify.

Rotas Dinâmicas e Parâmetros

Um dos pontos fortes das rotas no Fastify é a capacidade de definir rotas dinâmicas com parâmetros. Isso é particularmente útil para endpoints que precisam lidar com recursos específicos. Vamos considerar um exemplo em que queremos acessar um usuário específico pelo seu ID:

fastify.route({
  method: 'GET',
  url: '/users/:id',
  handler: async (request, reply) => {
    const { id } = request.params
    // Implemente a lógica para buscar o usuário pelo ID no MongoDB
    return { userId: id }
  }
})
Enter fullscreen mode Exit fullscreen mode

Aqui, :id é um parâmetro de rota que será capturado e disponibilizado em request.params. Esse padrão permite criar rotas muito mais flexíveis e poderosas.

Próximos Passos

Até agora, cobrimos a definição básica de rotas e como lidar com parâmetros dinâmicos. No entanto, há muito mais a explorar. No restante do capítulo, vamos nos aprofundar em tópicos avançados, como middleware de rotas, validação de entrada com JSON Schema, e integração completa com o MongoDB para criar endpoints CRUD completos. Esses tópicos não só ajudarão a solidificar seu entendimento, mas também prepararão você para construir APIs robustas e escaláveis com Node.js e Fastify.

Prepare-se para mergulhar fundo no mundo das rotas e descobrir como transformar sua aplicação em uma máquina poderosa, eficiente e bem organizada. Vamos codificar!

Capítulo 5: Explorando Fastify e MongoDB

Seção 2: Configurando o Ambiente

Na seção anterior, discutimos os benefícios de utilizar o Fastify com o Node.js e como o MongoDB se encaixa perfeitamente como uma solução de banco de dados para nossas aplicações. Agora, é hora de colocar a mão na massa e configurar nosso ambiente de desenvolvimento. Este passo é crucial para garantir que tenhamos todas as ferramentas necessárias para começar a construir nossa aplicação.

Instalando o Node.js e o npm

Antes de mais nada, precisamos garantir que o Node.js e o npm (Node Package Manager) estejam instalados em nossa máquina. O Node.js é a plataforma sobre a qual nossas aplicações serão executadas, enquanto o npm é o gerenciador de pacotes que nos permitirá instalar bibliotecas e frameworks como o Fastify.

  1. Verificando a Instalação do Node.js e npm Abra o terminal e execute os seguintes comandos para verificar se o Node.js e o npm já estão instalados:
   node -v
   npm -v
Enter fullscreen mode Exit fullscreen mode

Se ambos os comandos retornarem versões, significa que já temos o Node.js e o npm instalados. Caso contrário, siga para o próximo passo.

  1. Instalando o Node.js e npm Acesse o site oficial do Node.js nodejs.org e baixe a versão recomendada para sua plataforma. O instalador incluirá tanto o Node.js quanto o npm.

Criando um Projeto Node.js

Com o Node.js e o npm instalados, podemos criar nosso projeto. Vamos usar o npm para inicializar um novo projeto Node.js:

  1. Inicializando o Projeto Crie uma nova pasta para sua aplicação e navegue até ela pelo terminal:
   mkdir minha-aplicacao-fastify
   cd minha-aplicacao-fastify
Enter fullscreen mode Exit fullscreen mode

Em seguida, inicialize o projeto com o comando:

   npm init -y
Enter fullscreen mode Exit fullscreen mode

O comando -y aceita todas as configurações padrão, gerando um arquivo package.json básico.

Instalando o Fastify

Agora que nosso projeto está configurado, vamos instalar o Fastify. O Fastify é um framework web para Node.js que nos permite construir APIs rápidas e eficientes.

  1. Instalando o Fastify Execute o seguinte comando para instalar o Fastify como uma dependência do projeto:
   npm install fastify
Enter fullscreen mode Exit fullscreen mode

Após a instalação, você verá o Fastify listado nas dependências do package.json.

Configurando o MongoDB

Para armazenar e gerenciar nossos dados, utilizaremos o MongoDB. Existem várias maneiras de configurar o MongoDB, mas para simplificar, usaremos o MongoDB Atlas, um serviço de banco de dados em nuvem gratuito.

  1. Criando uma Conta no MongoDB Atlas
    Acesse MongoDB Atlas e crie uma conta. Siga as instruções para configurar um novo cluster gratuito.

  2. Conectando ao MongoDB Atlas
    Após configurar seu cluster, você receberá uma string de conexão. Vamos usar essa string para conectar nosso aplicativo ao MongoDB. Instale o cliente MongoDB para Node.js executando:

   npm install mongodb
Enter fullscreen mode Exit fullscreen mode

Crie um arquivo db.js para gerenciar a conexão com o banco de dados:

   const { MongoClient } = require('mongodb');

   const uri = 'sua-string-de-conexao-aqui';
   const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

   async function connect() {
     try {
       await client.connect();
       console.log('Conectado ao MongoDB!');
     } catch (e) {
       console.error('Erro ao conectar ao MongoDB', e);
     }
   }

   module.exports = { connect, client };
Enter fullscreen mode Exit fullscreen mode

Criando o Servidor Fastify

Com o ambiente de desenvolvimento configurado, é hora de criar nosso servidor Fastify e conectar ao MongoDB. Crie um arquivo server.js na raiz do projeto:

const fastify = require('fastify')({ logger: true });
const { connect } = require('./db');

fastify.get('/', async (request, reply) => {
  return { hello: 'world' };
});

const start = async () => {
  try {
    await connect();
    await fastify.listen(3000);
    console.log('Servidor rodando na porta 3000');
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};
start();
Enter fullscreen mode Exit fullscreen mode

Neste ponto, configuramos nosso ambiente para desenvolvimento com Node.js, Fastify e MongoDB. No próximo capítulo, exploraremos como criar rotas e manipuladores no Fastify, e começaremos a realizar operações CRUD (Create, Read, Update, Delete) no MongoDB. Vamos mergulhar mais fundo nas funcionalidades do Fastify e ver como ele pode simplificar o desenvolvimento de APIs robustas. Fique ligado!

Capítulo 5: Estruturando sua Aplicação com Fastify

Seção 3: Integrando o MongoDB com Fastify

No capítulo anterior, discutimos como configurar o Fastify e criar rotas básicas. Agora, vamos dar um passo adiante e integrar o MongoDB, um banco de dados NoSQL que será fundamental para armazenar e gerenciar dados na nossa aplicação Node.js.

Preparativos Iniciais

Antes de começarmos a codificar, precisamos garantir que temos todas as ferramentas necessárias instaladas. Primeiro, certifique-se de ter o MongoDB rodando na sua máquina ou em um serviço de hospedagem de banco de dados. Você pode encontrar instruções detalhadas para a instalação do MongoDB na documentação oficial.

Além disso, vamos precisar do driver oficial do MongoDB para Node.js, o mongodb, e de um ORM (Object-Relational Mapping) para facilitar a interação com o banco de dados, como o Mongoose. Para instalar essas dependências, execute o seguinte comando no terminal:

npm install mongodb mongoose
Enter fullscreen mode Exit fullscreen mode
Configurando o Mongoose

Com as dependências instaladas, vamos configurar o Mongoose em nossa aplicação Fastify. Crie um arquivo chamado database.js na raiz do seu projeto e adicione o seguinte código:

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect('mongodb://localhost:27017/devdoidodb', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('MongoDB conectado com sucesso!');
  } catch (err) {
    console.error('Erro ao conectar ao MongoDB:', err);
    process.exit(1);
  }
};

module.exports = connectDB;
Enter fullscreen mode Exit fullscreen mode

Neste código, estamos usando o método connect do Mongoose para estabelecer uma conexão com o MongoDB. Certifique-se de substituir a string de conexão pela URL do seu banco de dados, caso esteja usando um serviço de hospedagem diferente.

Integrando com o Fastify

Agora que temos a configuração do Mongoose pronta, vamos integrar isso na nossa aplicação Fastify. No arquivo principal do seu projeto, geralmente chamado de app.js ou server.js, importe o módulo database.js e chame a função connectDB antes de iniciar o servidor Fastify:

const fastify = require('fastify')({ logger: true });
const connectDB = require('./database');

// Conectando ao MongoDB
connectDB();

// Iniciando o servidor Fastify
const start = async () => {
  try {
    await fastify.listen(3000);
    fastify.log.info(`Servidor rodando em http://localhost:3000`);
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();
Enter fullscreen mode Exit fullscreen mode
Criando Modelos com Mongoose

Agora que temos o MongoDB integrado, vamos criar alguns modelos para representar nossos dados. Suponhamos que estamos construindo uma aplicação para gerenciar uma lista de tarefas. Crie uma pasta chamada models e, dentro dela, um arquivo Task.js com o seguinte conteúdo:

const mongoose = require('mongoose');

const TaskSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
  },
  description: {
    type: String,
  },
  status: {
    type: String,
    enum: ['pendente', 'concluída'],
    default: 'pendente',
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

module.exports = mongoose.model('Task', TaskSchema);
Enter fullscreen mode Exit fullscreen mode

Este modelo define a estrutura dos documentos de tarefas no nosso banco de dados, incluindo campos como title, description, status e createdAt.

Criando Rotas CRUD

Agora que temos nosso modelo de dados, vamos criar rotas CRUD (Create, Read, Update, Delete) para gerenciar essas tarefas. No arquivo onde você define suas rotas (routes.js, por exemplo), importe o modelo Task e adicione as seguintes rotas:

const Task = require('./models/Task');

module.exports = async function (fastify, opts) {
  // Rota para criar uma nova tarefa
  fastify.post('/tasks', async (request, reply) => {
    try {
      const task = new Task(request.body);
      await task.save();
      reply.code(201).send(task);
    } catch (err) {
      reply.code(500).send(err);
    }
  });

  // Rota para obter todas as tarefas
  fastify.get('/tasks', async (request, reply) => {
    try {
      const tasks = await Task.find();
      reply.send(tasks);
    } catch (err) {
      reply.code(500).send(err);
    }
  });

  // Rota para atualizar uma tarefa
  fastify.put('/tasks/:id', async (request, reply) => {
    try {
      const task = await Task.findByIdAndUpdate(request.params.id, request.body, { new: true });
      if (!task) {
        return reply.code(404).send({ message: 'Tarefa não encontrada' });
      }
      reply.send(task);
    } catch (err) {
      reply.code(500).send(err);
    }
  });

  // Rota para deletar uma tarefa
  fastify.delete('/tasks/:id', async (request, reply) => {
    try {
      const task = await Task.findByIdAndDelete(request.params.id);
      if (!task) {
        return reply.code(404).send({ message: 'Tarefa não encontrada' });
      }
      reply.send({ message: 'Tarefa deletada com sucesso' });
    } catch (err) {
      reply.code(500).send(err);
    }
  });
};
Enter fullscreen mode Exit fullscreen mode
Próximos Passos

Agora que temos um conjunto básico de operações CRUD para nossas tarefas, você já pode começar a interagir com o MongoDB através do Fastify. No próximo capítulo, vamos explorar como adicionar autenticação à nossa aplicação usando JWT (JSON Web Tokens), garantindo que apenas usuários autenticados possam acessar determinadas rotas.

Fique atento, pois a segurança é um aspecto crucial para qualquer aplicação web, e garantir que nossos dados estejam protegidos será nosso próximo desafio. Até lá, experimente criar e manipular tarefas, e familiarize-se

Top comments (0)