API REST com Node.js e MySQL: CRUD Completo Sem ORM

Aprenda a criar uma API REST com Node.js e MySQL, desenvolvendo um CRUD completo sem ORM, usando Express, SQL puro e boas práticas de backend.

Introdução – API REST com Node.js e MySQL

Criar uma API REST com Node.js e MySQL é um passo essencial para quem quer atuar no backend, desenvolver aplicações reais ou integrar sistemas com banco de dados. Entender essa conexão direto no SQL, sem depender de ORM, ajuda muito a ganhar base sólida e segurança no que está acontecendo por baixo dos panos.

Neste artigo, você vai aprender a criar um CRUD completo (Create, Read, Update e Delete) usando Node.js, Express e MySQL, sem ORM, exatamente como acontece em muitos projetos reais de backend. A ideia é sair do zero até uma API funcional, testando cada endpoint e entendendo o papel de cada arquivo.

Ao final, você terá uma API REST rodando localmente, conectada ao MySQL, pronta para ser consumida por um frontend, app mobile ou qualquer outro cliente.

Para fazer o download do(s) arquivo(s) utilizados na aula, preencha com o seu e-mail:

Não vamos te encaminhar nenhum tipo de SPAM! A Hashtag Treinamentos é uma empresa preocupada com a proteção de seus dados e realiza o tratamento de acordo com a Lei Geral de Proteção de Dados (Lei n. 13.709/18). Qualquer dúvida, nos contate.

Estrutura inicial do projeto Node.js

Antes de escrever qualquer código, você precisa de uma estrutura mínima e organizada. No material disponível para download, você encontrará todo o projeto já pronto para baixar e utilizar no seu computador.

Após descompactar o projeto, a estrutura de pastas e arquivos fica assim:

Estrutura inicial do projeto Node.js

O papel de cada arquivo

  • server.js: arquivo principal da API, onde ficam os endpoints, middlewares e a inicialização do servidor Express.
  • db.js: responsável exclusivamente pela conexão com o MySQL, usando pool de conexões.
  • .env: armazena variáveis de ambiente como porta da API e credenciais do banco de dados.
  • dev_db.txt: script SQL para criar o banco, a tabela e inserir dados de teste.
  • package.json: define as dependências do projeto, scripts e configurações do Node.js.
  • package-lock.json: garante que todas as dependências sejam instaladas nas mesmas versões exatas, mantendo o projeto consistente entre diferentes máquinas e ambientes.

Criando o banco de dados e a tabela no MySQL

Antes de conectar o Node.js, você precisa ter o banco pronto. No arquivo dev_db.txt, use o seguinte SQL:

SQL
CREATE DATABASE IF NOT EXISTS dev_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;

USE dev_db;

CREATE TABLE IF NOT EXISTS usuarios (
  id INT NOT NULL AUTO_INCREMENT,
  nome VARCHAR(100) NOT NULL,
  email VARCHAR(120) NOT NULL UNIQUE,
  PRIMARY KEY (id)
);

INSERT INTO usuarios (nome, email) VALUES
('Nome 1', 'nome1@dominio.com'),
('Nome 2', 'nome2@dominio.com'),
('Nome 3', 'nome3@dominio.com'),
('Nome 4', 'nome4@dominio.com');

Execute esse script no MySQL Workbench. Ele cria o banco, a tabela usuarios e já insere alguns registros para teste.

Banco de dados no MySQLWorkbench

Configurando variáveis de ambiente com dotenv

Nunca coloque credenciais direto no código. Crie um arquivo .env na raiz do projeto:

Codigo
PORT=3002
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
DB_DATABASE=dev_db
DB_PORT=3306

Essas informações variam de acordo com o seu ambiente. Em produção, esse arquivo não deve subir para o GitHub.

Conectando o Node.js ao MySQL (db.js)

Agora você cria a conexão com o banco usando mysql2/promise.

Python
import mysql from "mysql2/promise";
import dotenv from "dotenv";

dotenv.config();

export const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  port: Number(process.env.DB_PORT),
  waitForConnections: true,
  connectionLimit: 10,
});

Aqui você cria um pool de conexões, que melhora desempenho e evita abrir uma nova conexão a cada requisição. Assim você tem uma conexão pronta para ser reutilizada em qualquer parte da API.

Ícone Full StackFull Stack Impressionador

Essa é uma trilha de especialização que vai te tornar um verdadeiro Desenvolvedor Web Full Stack, dominando todas as principais tecnologias usadas tanto para o Front End quanto para o Backend e ainda para Mobile, construindo projetos práticos e exercícios aplicados à realidade das empresas. Tudo o que você precisa para se tornar um Desenvolvedor Full Stack em um único lugar.

Começar agoraSeta para a direita
Fundo Full StackTelas Full Stack
Luz Full Stack

Criando a API REST com Express (server.js)

No server.js, começa a estrutura básica da API:

Python
import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import { pool } from "./db.js";

dotenv.config();

const app = express();
const PORT = process.env.PORT;

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

Esses middlewares permitem:

  • Comunicação entre domínios (CORS)
  • Receber dados em JSON no body das requisições

O que é CRUD em uma API REST?

CRUD é um acrônimo que representa as quatro operações básicas que uma aplicação faz ao trabalhar com banco de dados:

  • Create: criar um novo registro
  • Read: ler ou listar registros
  • Update: atualizar um registro existente
  • Delete: remover um registro

Em uma API REST com Node.js e MySQL, cada uma dessas operações costuma ser representada por um endpoint e por um verbo HTTP específico:

  • POST → Create
  • GET → Read
  • PUT ou PATCH → Update
  • DELETE → Delete

Ao longo desta seção, você vai implementar um CRUD completo para a tabela usuarios, entendendo exatamente o que cada rota faz, como ela se conecta ao banco de dados e qual resultado esperar em cada requisição.

CREATE – Criar usuário no banco de dados

O primeiro endpoint do CRUD é o Create, usando POST.

Codigo
app.post("/", async (req, res) => {
  try {
    const { nome, email } = req.body;

    const [result] = await pool.query(
      "INSERT INTO usuarios (nome, email) VALUES (?, ?)",
      [nome, email]
    );

    res.status(201).json({ id: result.insertId, nome, email });
  } catch (e) {
    res.status(500).json({ erro: "Falha ao criar usuário" });
  }
});

Aqui você já aplica uma boa prática importante: SQL parametrizado, evitando SQL Injection. Dessa fora o usuário é criado no banco e recebemos a resposta com status 201 Created.

READ – Listar usuários

Agora você cria o endpoint de leitura usando GET.

Codigo
app.get("/", async (req, res) => {
  try {
    const [rows] = await pool.query("SELECT * FROM usuarios");
    res.json(rows);
  } catch (e) {
    res.status(500).json({ erro: "Falha ao listar usuários" });
  }
});

Esse endpoint retorna todos os registros da tabela usuarios.

UPDATE – Atualizar usuário

Para atualizar um usuário, você usa PUT e passa o id na URL.

Codigo
app.put("/:id", async (req, res) => {
  try {
    const { id } = req.params;
    const { nome, email } = req.body;

    const [result] = await pool.query(
      "UPDATE usuarios SET nome = COALESCE(?, nome), email = COALESCE(?, email) WHERE id = ?",
      [nome || null, email || null, id]
    );

    if (!result.affectedRows) {
      return res.status(404).json({ erro: "Usuário não encontrado" });
    }

    res.json({ mensagem: "Atualizado com sucesso" });
  } catch (e) {
    res.status(500).json({ erro: "Falha ao atualizar usuário" });
  }
});

O COALESCE garante que apenas os campos enviados sejam alterados.

DELETE – Remover usuário

O último passo do CRUD é o DELETE.

Codigo
app.delete("/:id", async (req, res) => {
  try {
    const { id } = req.params;

    const [result] = await pool.query(
      "DELETE FROM usuarios WHERE id = ?",
      [id]
    );

    if (!result.affectedRows) {
      return res.status(404).json({ erro: "Usuário não encontrado" });
    }

    res.json({ mensagem: "Deletado com sucesso" });
  } catch (e) {
    res.status(500).json({ erro: "Falha ao deletar usuário" });
  }
});

Rodando o servidor

Finalize o arquivo com:

Codigo
app.listen(PORT, () => {
  console.log(`Servidor MySQL rodando em http://localhost:${PORT}`);
});

No package.json, use:

Codigo
"scripts": {
  "watch": "node --watch ./src/server.js"
}

E rode:

Codigo
npm install
npm run watch

Testando a API REST

Você pode testar com:

  • Insomnia
  • Postman
  • Hoppscotch (online)

Teste todos os métodos:

  • POST /
  • GET /
  • PUT /:id
  • DELETE /:id

Próximos passos possíveis

Depois dessa API REST com Node.js e MySQL, você pode evoluir para:

  • Autenticação com JWT
  • Validação de dados
  • Paginação
  • Integração com frontend
  • Deploy em servidor

Se quiser entender melhor conceitos básicos antes de avançar, vale revisar conteúdos como Minicurso de Node.JS e Como Criar uma API REST com Node.js e Express do ZERO.

Para aprofundar seus conhecimentos de SQL, consulte a documentação oficial do MySQL.

Conclusão

Agora você já sabe criar uma API REST com Node.js e MySQL, desenvolvendo um CRUD completo sem ORM, entendendo cada etapa da conexão com o banco de dados. Esse conhecimento é base para qualquer backend profissional.

Se você quer evoluir isso para projetos reais, com frontend, autenticação, deploy e arquitetura profissional, conheça o Curso Full Stack Impressionador.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

FAQ – Perguntas Frequentes

1. Vale a pena criar API REST sem ORM?

Sim. Trabalhar sem ORM ajuda a entender SQL de verdade e o funcionamento real do banco, o que é muito valorizado no mercado.

2. Esse CRUD serve para projetos reais?

Serve como base. Em produção, você adiciona validações, autenticação e tratamento de erros mais avançado.

3. Posso usar PostgreSQL no lugar do MySQL?

Pode. A lógica do CRUD é a mesma, mudando apenas o driver e algumas diferenças de SQL.

4. Preciso saber SQL para usar Node.js no backend?

Não é obrigatório, mas saber SQL amplia muito suas possibilidades e controle do sistema.

5. Essa API pode ser usada com frontend React ou Vue?

Sim. Qualquer frontend que faça requisições HTTP pode consumir essa API.

Hashtag Treinamentos

Para acessar publicações de Full Stack, clique aqui!


Quer aprender mais sobre JavaScript com um minicurso básico gratuito?








Posts mais recentes de Full Stack

Posts mais recentes da Hashtag Treinamentos