Introdução
Neste tutorial, você aprenderá a criar uma API RESTful utilizando Node.js e o framework Express. Nossa jornada começará com a configuração do ambiente e prosseguirá pela construção de um sistema completo que inclui rotas, controladores, serviços e um banco de dados. O objetivo é fornecer uma compreensão clara do funcionamento do Express, bem como as melhores práticas para desenvolvimento de APIs, incluindo autenticação, validação de dados e testes. Este é um guia ideal para desenvolvedores que desejam expandir suas habilidades em JavaScript e backend, criando aplicações escaláveis e eficientes.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o Node.js instalado em sua máquina. Você pode verificar a instalação utilizando o comando `node -v`. Para gerenciar pacotes, também é necessário ter o npm (Node Package Manager) instalado, que geralmente vem junto com o Node.js.
commands# Verificar versões instaladas
node -v
npm -vCriação do Projeto Node.js
Utilize o npm para criar um novo projeto Node.js. Execute o comando `npm init -y` em um diretório de sua escolha para inicializar um novo projeto. Isso criará um arquivo `package.json` básico que gerenciará as dependências do seu projeto.
commandsnpm init -y
Instalação das Dependências Necessárias
Instale o Express, um framework minimalista para desenvolvimento de servidores web em Node.js, e o Mongoose, que facilitará a interação com um banco de dados MongoDB. Execute o seguinte comando para instalar as dependências.
commandsnpm install express mongoose
Configuração do Servidor Express
Crie um arquivo chamado `server.js` e configure o servidor Express. Este arquivo será o ponto de entrada da aplicação. Nele, importe o Express e configure uma rota básica.
server.jsconst express = require('express'); const mongoose = require('mongoose'); const app = express(); app.use(express.json()); app.get('/', (req, res) => { res.send('API running!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Servidor rodando na porta ${PORT}`); });
Configuração do Banco de Dados com Mongoose
Conecte-se ao MongoDB utilizando o Mongoose. Atualize o arquivo `server.js` para incluir a conexão com o banco de dados. Certifique-se de ter o MongoDB instalado e rodando em sua máquina.
server.jsmongoose.connect('mongodb://localhost:27017/meuBanco', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('Conectado ao MongoDB')) .catch(err => console.error('Erro ao conectar ao MongoDB', err));
Criação do Modelo de Dados
Crie um diretório chamado `models` e adicione um arquivo `Produto.js`. Neste arquivo, defina o modelo de dados que representa os produtos na aplicação, utilizando Mongoose.
models/Produto.jsconst mongoose = require('mongoose'); const produtoSchema = new mongoose.Schema({ nome: { type: String, required: true }, preco: { type: Number, required: true } }); module.exports = mongoose.model('Produto', produtoSchema);
Implementação das Rotas CRUD
Crie um diretório chamado `routes` e adicione um arquivo `produtoRoutes.js`. Neste arquivo, defina as rotas para criar, ler, atualizar e excluir produtos utilizando o modelo que você criou.
routes/produtoRoutes.jsconst express = require('express'); const Produto = require('../models/Produto'); const router = express.Router(); router.get('/', async (req, res) => { const produtos = await Produto.find(); res.json(produtos); }); router.post('/', async (req, res) => { const produto = new Produto(req.body); await produto.save(); res.status(201).json(produto); }); router.put('/:id', async (req, res) => { const { id } = req.params; const produto = await Produto.findByIdAndUpdate(id, req.body, { new: true }); res.json(produto); }); router.delete('/:id', async (req, res) => { const { id } = req.params; await Produto.findByIdAndDelete(id); res.status(204).send(); }); module.exports = router;
Integração das Rotas ao Servidor
Importe e utilize as rotas definidas em `produtoRoutes.js` no seu arquivo principal `server.js`.
server.jsconst produtoRoutes = require('./routes/produtoRoutes'); app.use('/api/produtos', produtoRoutes);
Testes Unitários com Jest
Instale o Jest para testes unitários, que irá ajudá-lo a garantir que a lógica do seu aplicativo esteja funcionando corretamente. Crie um arquivo de teste para o modelo Produto.
commandsnpm install --save-dev jest supertest
tests/produto.test.jsconst request = require('supertest'); const app = require('../server'); // ajuste o caminho do server.js describe('Teste de Produtos', () => { it('Deve criar um novo produto', async () => { const res = await request(app) .post('/api/produtos') .send({ nome: 'Produto Teste', preco: 29.99 }); expect(res.statusCode).toEqual(201); expect(res.body).toHaveProperty('nome', 'Produto Teste'); }); });
Executando a Aplicação e Testes
Finalize iniciando a aplicação e executando os testes. Utilize o comando abaixo para rodar a aplicação e os testes unitários.
commands# Executar a aplicação
node server.js
# Executar os testes
npm test
Conclusão
Neste tutorial, você aprendeu a desenvolver uma API RESTful completa utilizando Node.js e Express. Cobrimos a configuração do ambiente, a definição de um modelo de dados com Mongoose, a implementação de rotas para gerenciar produtos e a importância de testes unitários para garantir a qualidade do código. Com esses conhecimentos, você está preparado para desenvolver aplicações mais robustas e escaláveis utilizando a stack JavaScript.