Criando sua Primeira API CRUD com Node.
js,
Express, Sequelize, MVC e MySQL
Guia passo a passo para criar uma API RESTful organizada no padrão MVC utilizando [Link],
Express, Sequelize e MySQL.
■ Estrutura de Pastas
api-crud-mvc-mysql/
■■■ config/
■ ■■■ [Link]
■■■ models/
■ ■■■ [Link]
■■■ controllers/
■ ■■■ [Link]
■■■ routes/
■ ■■■ [Link]
■■■ [Link]
■■■ [Link]
■ Parte 1: Preparando o Projeto
mkdir api-crud-mvc-mysql
cd api-crud-mvc-mysql
npm init -y
npm install express cors sequelize mysql2
npm install -D nodemon
■ Parte 2: Configuração do Banco de Dados
// config/[Link]
import { Sequelize } from "sequelize";
const sequelize = new Sequelize("api_crud_mvc", "root", "sua_senha", {
host: "localhost",
dialect: "mysql",
logging: false
});
export default sequelize;
■ Parte 3: Definindo o Modelo
// models/[Link]
import { DataTypes } from "sequelize";
import sequelize from "../config/[Link]";
const Task = [Link]("Task", {
id: { type: [Link], autoIncrement: true, primaryKey: true },
title: { type: [Link], allowNull: false },
description: { type: [Link], allowNull: true },
completed: { type: [Link], defaultValue: false }
}, { timestamps: true });
export default Task;
■ Parte 4: Criando os Controllers
// controllers/[Link]
import Task from "../models/[Link]";
export const createTask = async (req, res) => {
try {
const { title, description, completed } = [Link];
const task = await [Link]({ title, description, completed });
[Link](201).json(task);
} catch (error) {
[Link](400).json({ message: "Erro ao criar tarefa", error: [Link] });
}
};
export const getTasks = async (req, res) => {
try {
const tasks = await [Link]();
[Link](200).json(tasks);
} catch (error) {
[Link](500).json({ message: "Erro ao buscar tarefas", error: [Link] });
}
};
export const getTaskById = async (req, res) => {
try {
const { id } = [Link];
const task = await [Link](id);
if (task) [Link](200).json(task);
else [Link](404).json({ message: "Tarefa não encontrada" });
} catch (error) {
[Link](500).json({ message: "Erro ao buscar tarefa", error: [Link] });
}
};
export const updateTask = async (req, res) => {
try {
const { id } = [Link];
const { title, description, completed } = [Link];
const task = await [Link](id);
if (task) {
[Link] = title ?? [Link];
[Link] = description ?? [Link];
[Link] = completed ?? [Link];
await [Link]();
[Link](200).json(task);
} else [Link](404).json({ message: "Tarefa não encontrada" });
} catch (error) {
[Link](400).json({ message: "Erro ao atualizar tarefa", error: [Link] });
}
};
export const deleteTask = async (req, res) => {
try {
const { id } = [Link];
const task = await [Link](id);
if (task) {
await [Link]();
[Link](204).send();
} else [Link](404).json({ message: "Tarefa não encontrada" });
} catch (error) {
[Link](500).json({ message: "Erro ao deletar tarefa", error: [Link] });
}
};
■■ Parte 5: Definindo as Rotas
// routes/[Link]
import express from "express";
import { createTask, getTasks, getTaskById, updateTask, deleteTask } from "../controllers/[Link]"
const router = [Link]();
[Link]("/tasks", createTask);
[Link]("/tasks", getTasks);
[Link]("/tasks/:id", getTaskById);
[Link]("/tasks/:id", updateTask);
[Link]("/tasks/:id", deleteTask);
export default router;
■ Parte 6: Arquivo Principal
// [Link]
import express from "express";
import cors from "cors";
import sequelize from "./config/[Link]";
import taskRoutes from "./routes/[Link]";
const app = express();
const port = 3333;
[Link](cors());
[Link]([Link]());
[Link](taskRoutes);
try {
await [Link]();
[Link]("■ Conexão com MySQL estabelecida!");
await [Link]();
[Link]("■ Modelos sincronizados!");
} catch (error) {
[Link]("■ Erro ao conectar ao banco:", error);
}
[Link](port, () => {
[Link](`■ Servidor rodando em [Link]
});
■ Parte 7: Testando a API
Use Postman ou Insomnia para testar os endpoints:
- POST /tasks → cria uma nova tarefa
- GET /tasks → retorna todas
- GET /tasks/:id → retorna uma específica
- PUT /tasks/:id → atualiza
- DELETE /tasks/:id → deleta
■ Script SQL Inicial (opcional)
CREATE DATABASE api_crud_mvc;
USE api_crud_mvc;
CREATE TABLE Tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
completed BOOLEAN DEFAULT FALSE,
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);