Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

DEV Community

Cover image for 🛠️ Criando uma API Node.js com Express + CORS e consumindo com HTML + Bootstrap
rodrigozan
rodrigozan

Posted on

🛠️ Criando uma API Node.js com Express + CORS e consumindo com HTML + Bootstrap

Neste artigo, vamos aprender a criar uma API básica em Node.js utilizando o framework Express e o middleware CORS. Em seguida, vamos consumir essa API em uma página HTML que permite realizar operações CRUD (Criar, Ler, Atualizar e Deletar) usando a Fetch API e o Bootstrap para estilização.

🤖 O que é uma API?

API significa Application Programming Interface (em português, Interface de Programação de Aplicações).

Em resumo, uma API é um conjunto de regras que permite que dois sistemas diferentes "conversem" entre si.

🧠 Uma explicação simples

Pense na API como um garçom em um restaurante:

  • Você (cliente) olha o cardápio (interface).
  • Faz um pedido (requisição).
  • O garçom (API) leva seu pedido para a cozinha (o sistema).
  • Depois, ele traz a comida pronta (resposta).

Você não precisa saber como a cozinha funciona, apenas como fazer o pedido certo. A API cuida do resto.

🛠 Em termos técnicos

Uma API define rotas/endpoints e métodos (como GET, POST, PUT, DELETE) para:

  • Buscar dados
  • Criar dados
  • Atualizar dados
  • Deletar dados

Exemplo de chamadas:

Método URL Ação
GET /api/items Pega todos os itens
POST /api/items Cria um novo item
PUT /api/items/:id Atualiza um item
DELETE /api/items/:id Deleta um item

📱 Exemplo do dia a dia

Um site de clima pode usar uma API para buscar:

  • Temperatura atual
  • Previsão dos próximos dias

Já um app de delivery pode usar várias APIs:

  • Para mostrar restaurantes
  • Para processar pagamentos
  • Para rastrear entregas

🧑‍💻 Em Node.js, como veremos, criamos APIs com Express para:

  • Criar servidores rápidos e leves
  • Definir rotas e respostas
  • Trabalhar com dados no formato JSON

Agora que já entendemos o que é uma API, vamos parar de teoria e colocar a mão na massa.

🧰 Configurando o Ambiente

Primeiro, você precisa ter o Node.js instalado em sua máquina. Você pode baixá-lo aqui:

Depois de instalar o Node.js, criremos a estrutura da API.

📁 Estrutura da API

crud-api/
├── server.js
├── package.json
Enter fullscreen mode Exit fullscreen mode

Server.js

O arquivo server.js é o arquivo principal da aplicação. Nele fica o código do servidor Node.js, que geralmente usa o Express para criar rotas e endpoints da API.

Ele é o ponto de entrada do projeto, ou seja, quando você roda node server.js, é esse arquivo que será executado.

Package.json

Este arquivo é o coração do projeto Node.js. Ele contém:

As informações do projeto (nome, versão, descrição, autor).

A lista de dependências (como express, cors etc.).

Scripts que você pode executar com npm run.

Outras configurações para o projeto.

Exemplo básico de package.json:

{
  "name": "crud-api",
  "author": "Rodrigo Zandonadi",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.18.2"
  }
}
Enter fullscreen mode Exit fullscreen mode

Veremos um exemplo de criação do arquivo server.js abaixo.

1️⃣ Iniciando o projeto

Vamos criar um novo diretório para o seu projeto e inicializar um novo projeto Node.js:

mkdir crud-api
cd crud-api
npm init -y
Enter fullscreen mode Exit fullscreen mode

O comando npm init -y cria um arquivo package.json, que é o start de um projeto node.js.

2️⃣ Instalando Dependências

📦 O que são dependências em um projeto Node.js?

As dependências são bibliotecas externas (ou pacotes) que seu projeto precisa para funcionar corretamente.

Por exemplo:

Se você quer criar um servidor web mais facilmente (que é o nosso caso), você usa o pacote express.

Se você precisa permitir que sua API seja acessada de outros domínios, você usa cors.

Se for conectar a um banco MongoDB, pode usar mongoose.

Essas bibliotecas são instaladas via npm (Node Package Manager), com o comando:

npm install <nome-do-pacote>
Enter fullscreen mode Exit fullscreen mode

Instale as dependências necessárias: Express e CORS.

npm install express cors
Enter fullscreen mode Exit fullscreen mode

Caso prefira, você pode utilizar o yarn para manipular as dependências. Para isso você precisa instalar o globalmente na sua máquina, com o comando npm install --global yarn, e, em seguida, rodar no diretório da sua API:

yarn add express cors
Enter fullscreen mode Exit fullscreen mode

📁 Onde as dependências ficam?

Elas são baixadas e salvas na pasta node_modules (automaticamente).

Também são listadas no arquivo package.json, dentro da chave "dependencies":

"dependencies": {
  "express": "^4.18.2",
  "cors": "^2.8.5"
}
Enter fullscreen mode Exit fullscreen mode

🛠 Exemplo prático

Quando você instala algo assim:

npm install express cors
Enter fullscreen mode Exit fullscreen mode

O package.json fica assim:

"dependencies": {
  "express": "^4.18.2",
  "cors": "^2.8.5"
}
Enter fullscreen mode Exit fullscreen mode

E no seu código (server.js), você pode usar assim:

const express = require('express');
const cors = require('cors');
Enter fullscreen mode Exit fullscreen mode

⚠️ Dica Importante

A pasta node_modules não deve ser enviada para o Git. Por isso, você geralmente inclui ela no arquivo .gitignore.

É só criar um arquivo .gitignore e adicionar node_modules nele.

node_modules
Enter fullscreen mode Exit fullscreen mode

3️⃣ Criando a Estrutura da API

Crie um arquivo chamado server.js e adicione o seguinte código:

const express = require('express'); // insere o módulo do express na variável express


const app = express(); // Cria uma instância do servidor Express.
const PORT = 3000; // Define a porta do seu computador onde o servidor vai rodar. No caso, a porta 3000 é usada por __default__ (padrão) ao trabalhar com Node.js

app.use(express.json()); // Permite que o Express entenda requisições com body em formato JSON (como em POST e PUT).

// O código abaixo inicia o servidor na porta 3000.
app.listen(PORT, () => {
    console.log(`Servidor rodando em http://localhost:${PORT}`);
});

Enter fullscreen mode Exit fullscreen mode

Abaixo temos o código completo do server.js:

const express = require('express');
const cors = require('cors'); 

const app = express();
const PORT = 3000;

app.use(cors());
app.use(express.json());

let items = [];

// Criar um item
app.post('/api/items', (req, res) => {
    const item = req.body;
    items.push(item);
    res.status(201).json(item);
});

// Ler todos os itens
app.get('/api/items', (req, res) => {
    res.json(items);
});

// Atualizar um item
app.put('/api/items/:id', (req, res) => {
    const { id } = req.params;
    const updatedItem = req.body;
    items[id] = updatedItem;
    res.json(updatedItem);
});

// Deletar um item
app.delete('/api/items/:id', (req, res) => {
    const { id } = req.params;
    items.splice(id, 1);
    res.status(204).send();
});

app.listen(PORT, () => {
    console.log(`Servidor rodando em http://localhost:${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

Agora vou explicar passo a passo esse arquivo.

Explicação

🔌 1. Importando bibliotecas

const express = require('express');
const cors = require('cors');
Enter fullscreen mode Exit fullscreen mode

express: Framework que simplifica a criação de servidores HTTP com Node.js.
cors: Middleware que habilita o CORS (Cross-Origin Resource Sharing), permitindo que seu servidor aceite requisições de diferentes origens (por exemplo, de um frontend rodando em outro domínio).

🚀 2. Inicializando o app

const app = express();
const PORT = 3000;
Enter fullscreen mode Exit fullscreen mode

app: Cria uma instância do servidor Express.
PORT: Define a porta onde o servidor vai rodar.

⚙️ 3. Middlewares globais

app.use(cors());
app.use(express.json());
Enter fullscreen mode Exit fullscreen mode

app.use(cors()): Permite que qualquer domínio acesse a API (útil para consumir com o frontend).
app.use(express.json()): Permite que o Express entenda requisições com body em formato JSON (como em POST e PUT).

📦 4. Base de dados simulada

let items = [];
Enter fullscreen mode Exit fullscreen mode

Simula um "banco de dados em memória" com um array de objetos.

Os dados serão perdidos ao reiniciar o servidor (útil para testes simples).

📩 5. Criar um item (POST)

app.post('/api/items', (req, res) => {
    const item = req.body;
    items.push(item);
    res.status(201).json(item);
});
Enter fullscreen mode Exit fullscreen mode

Rota POST /api/items

Lê os dados do corpo da requisição (req.body), adiciona ao array items, e retorna o item criado com status 201 (Created).

📥 6. Ler todos os itens (GET)

app.get('/api/items', (req, res) => {
    res.json(items);
});
Enter fullscreen mode Exit fullscreen mode

Rota GET /api/items

Retorna todos os itens do array items como JSON.

✏️ 7. Atualizar um item (PUT)

app.put('/api/items/:id', (req, res) => {
    const { id } = req.params;
    const updatedItem = req.body;
    items[id] = updatedItem;
    res.json(updatedItem);
});
Enter fullscreen mode Exit fullscreen mode

Rota PUT /api/items/:id

Atualiza um item com o índice (id) informado na URL, substituindo pelo novo conteúdo do req.body.

⚠️ Aqui o id é o índice do array (não um ID único real). Cuidado com isso em projetos reais!

🗑️ 8. Deletar um item (DELETE)

app.delete('/api/items/:id', (req, res) => {
    const { id } = req.params;
    items.splice(id, 1);
    res.status(204).send();
});
Enter fullscreen mode Exit fullscreen mode

Rota DELETE /api/items/:id

Remove o item com índice id do array.

Retorna status 204 (No Content) para indicar que foi deletado com sucesso.

🔊 9. Iniciando o servidor

app.listen(PORT, () => {
    console.log(`Servidor rodando em http://localhost:${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

Inicia o servidor na porta 3000.

Exibe uma mensagem no console para indicar que o servidor está ativo.

4️⃣ Testando a API

Inicie o servidor com o comando:

node server.js
Enter fullscreen mode Exit fullscreen mode

Ou crie um script no package.json na seção scripts, acima de dependencies:

"scripts": {
  "start": "node server.js"
},
"dependencies": {
  "express": "^4.18.2",
  "cors": "^2.8.5"
}
Enter fullscreen mode Exit fullscreen mode

Então, rode o script no terminal:

npm start
Enter fullscreen mode Exit fullscreen mode

Se quiser testar os endpoints separadamente, use ferramentas como Insomnia ou Postman.

Agora, você pode fazer requisições para http://localhost:3000/api/items.

Se você não souber como fazer esse passo, fique tranquilo. Faremos os testes após criar a página HTML direto no navegador.

5️⃣ Criando a Página HTML

Crie uma página HTML dentro de um projeto frontend para consumir os dados de sua API:

📁 Estrutura da API

crud-frontend/
├── index.html
├── assets/css/styles.css (opicional)
├── assets/js/scripts.css (opicional)
Enter fullscreen mode Exit fullscreen mode

Crie um arquivo chamado index.html e adicione o seguinte código:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CRUD com API</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container">
        <h1 class="mt-5">CRUD com API</h1>
        <form id="itemForm" class="mt-3">
            <input type="text" id="itemInput" class="form-control" placeholder="Digite um item" required>
            <button type="submit" class="btn btn-primary mt-2">Adicionar Item</button>
        </form>
        <ul id="itemList" class="list-group mt-3"></ul>
    </div>

    <script>
        const form = document.getElementById('itemForm');
        const itemInput = document.getElementById('itemInput');
        const itemList = document.getElementById('itemList');

        const fetchItems = async () => {
            const response = await fetch('http://localhost:3000/api/items');
            const items = await response.json();
            itemList.innerHTML = '';
            items.forEach((item, index) => {
                const li = document.createElement('li');
                li.className = 'list-group-item d-flex justify-content-between align-items-center';
                li.textContent = item;
                li.appendChild(createDeleteButton(index));
                itemList.appendChild(li);
            });
        };

        const createDeleteButton = (id) => {
            const button = document.createElement('button');
            button.className = 'btn btn-danger btn-sm';
            button.textContent = 'Deletar';
            button.onclick = async () => {
                await fetch(`http://localhost:3000/api/items/${id}`, { method: 'DELETE' });
                fetchItems();
            };
            return button;
        };

        form.onsubmit = async (e) => {
            e.preventDefault();
            const item = itemInput.value;
            await fetch('http://localhost:3000/api/items', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(item),
            });
            itemInput.value = '';
            fetchItems();
        };

        fetchItems();
    </script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

6️⃣ Testando a Aplicação

Abra o arquivo index.html em um navegador. Você deve ver um formulário onde pode adicionar itens. Os itens adicionados aparecerão em uma lista abaixo, e você poderá deletá-los.

Recaptilando

  • Baixe o Node.js
  • Crie um diretório para a api
  • Baixe as dependências
  • Crie o arquivo da API
  • Teste a API
  • Crie o projeto HTML
  • Crie a página HTML
  • Abra a página html em um navegador
  • Teste a API através da página HTML

Conclusão

Neste artigo, você aprendeu a criar uma API básica em Node.js usando Express e CORS, além de consumir essa API em uma página HTML com operações CRUD. Essa é uma base sólida para desenvolver aplicações mais complexas.

Sinta-se à vontade para expandir essa aplicação, adicionando funcionalidades como edição de itens ou persistência em um banco de dados.

Se quiser se aprofundar na criação de APIs com Node.js utilizando um banoc de dados não-relacional bem poderoso, recomendo a leitura do artigo:

E se tiver alguma dúvida, é só comentar que ajudo no que conseguir.

Top comments (0)