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.
O que você vai ver aqui?
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:

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

Configurando variáveis de ambiente com dotenv
Nunca coloque credenciais direto no código. Crie um arquivo .env na raiz do projeto:
PORT=3002
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
DB_DATABASE=dev_db
DB_PORT=3306Essas 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.
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.
Criando a API REST com Express (server.js)
No server.js, começa a estrutura básica da API:
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.
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.
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.
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.
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:
app.listen(PORT, () => {
console.log(`Servidor MySQL rodando em http://localhost:${PORT}`);
});No package.json, use:
"scripts": {
"watch": "node --watch ./src/server.js"
}E rode:
npm install
npm run watchTestando 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!
Posts mais recentes de Full Stack
- LESS CSS: Guia Completo do Pré-processador (2026)LESS CSS é um pré-processador que adiciona variáveis, mixins, nesting e operações matemáticas ao CSS. Aprenda a configurar e usar com projeto prático.
- Variáveis no CSS (CSS Variables): Como Usar de Forma ProfissionalVocê sabe o que são Variáveis no CSS (CSS Variables)? Aprenda como usar técnicas que vão transformar a forma como você escreve variáveis CSS.
- Try Catch no JavaScript: Programação Defensiva na PráticaAprenda a usar try catch no JavaScript e melhore a sua programação defensiva!
Posts mais recentes da Hashtag Treinamentos
- Planilha de Controle de Notas Fiscais no Excel [Grátis]Baixe a planilha de controle de notas fiscais no Excel grátis: calcule ISS e retenções, veja o que está em aberto e gere a cobrança de cada nota de serviço.
- Qual IA usar na empresa: ChatGPT, Claude ou Perplexity?Qual IA usar na empresa: veja as diferenças entre ChatGPT, Claude e Perplexity e quando cada um rende mais em cada área da sua equipe.
- Apostilas Gratuitas em PDF: Excel, Power BI, Python e IABaixe apostilas gratuitas em PDF de Excel, Power BI, Python, Claude e agentes de IA, com exercícios e gabarito. Escolha a sua e comece hoje.









