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

  1. 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 -v

  2. Criaçã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.

    commands
    npm init -y

  3. 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.

    commands
    npm install express mongoose

  4. 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.js
    const 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}`);
    });

  5. 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.js
    mongoose.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));

  6. 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.js
    const mongoose = require('mongoose');
    
    const produtoSchema = new mongoose.Schema({
        nome: { type: String, required: true },
        preco: { type: Number, required: true }
    });
    
    module.exports = mongoose.model('Produto', produtoSchema);

  7. 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.js
    const 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;

  8. Integração das Rotas ao Servidor

    Importe e utilize as rotas definidas em `produtoRoutes.js` no seu arquivo principal `server.js`.

    server.js
    const produtoRoutes = require('./routes/produtoRoutes');
    
    app.use('/api/produtos', produtoRoutes);

  9. 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.

    commands
    npm install --save-dev jest supertest

    tests/produto.test.js
    const 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');
        });
    });

  10. 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.

Hashtags

#NodeJS #Express #APIs #MongoDB #DesenvolvimentoWeb #JavaScript