Membuat REST API CRUD dengan Node.js, Express, dan MySQL
Zelixify
Editor
Dalam pengembangan aplikasi modern, REST API menjadi salah satu komponen penting untuk menghubungkan frontend dan backend. Salah satu kombinasi populer untuk membangun REST API adalah menggunakan Node.js dan Express sebagai server, serta MySQL sebagai database.
Pada artikel ini, kamu akan belajar langkah demi langkah membuat CRUD API (Create, Read, Update, Delete) sederhana menggunakan Node.js, Express, dan MySQL.
1. Persiapan Awal
a. Instalasi Tools yang Diperlukan
Pastikan kamu sudah menginstal:
Node.js
MySQL Server
Text editor seperti VS Code
b. Buat Folder Project
mkdir nodejs-crud-api
cd nodejs-crud-apic. Inisialisasi Project Node.js
npm init -yd. Install Dependencies
npm install express mysql2 body-parser corsexpress→ framework untuk membuat server.mysql2→ koneksi ke database MySQL.body-parser→ parsing data dari request body.cors→ agar API bisa diakses dari frontend lain.
2. Membuat Struktur Folder
Buat struktur sederhana seperti ini:
nodejs-crud-api/
│
├── db.js
├── server.js
└── routes/
└── userRoutes.js3. Konfigurasi Database (MySQL)
Buat database baru di MySQL:
CREATE DATABASE crud_api;
USE crud_api;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
age INT
);4. Koneksi ke Database (db.js)
require("dotenv").config();
const mysql = require("mysql2/promise");
const db = mysql.createPool({
host: process.env.DB_HOST || "localhost",
user: process.env.DB_USER || "root",
password: process.env.DB_PASSWORD || "",
database: process.env.DB_NAME || "crud_api",
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
(async () => {
try {
const connection = await db.getConnection();
console.log("✅ Database connected!");
connection.release();
} catch (error) {
console.error("❌ Database connection failed:", error.message);
process.exit(1);
}
})();
module.exports = db;5. Membuat Server (server.js)
require("dotenv").config();
const express = require("express");
const cors = require("cors");
const userRoutes = require("./routes/userRoutes");
const app = express();
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/api/users", userRoutes);
app.use((req, res) => {
res.status(404).json({ message: "Endpoint not found" });
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).json({ message: "Internal server error" });
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`🚀 Server running at http://localhost:${PORT}`);
});6. Membuat Routing CRUD (routes/userRoutes.js)
const express = require("express");
const router = express.Router();
const db = require("../db");
// CREATE
router.post("/", async (req, res) => {
try {
const { name, email, age } = req.body;
if (!name || !email || age === undefined) {
return res.status(400).json({ message: "Data tidak lengkap" });
}
const sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
const [result] = await db.execute(sql, [name, email, age]);
res.status(201).json({
message: "User berhasil ditambahkan",
id: result.insertId
});
} catch (error) {
res.status(500).json({ message: error.message });
}
});
// READ ALL
router.get("/", async (req, res) => {
try {
const [rows] = await db.execute("SELECT * FROM users");
res.json(rows);
} catch (error) {
res.status(500).json({ message: error.message });
}
});
// READ BY ID
router.get("/:id", async (req, res) => {
try {
const { id } = req.params;
const [rows] = await db.execute("SELECT * FROM users WHERE id = ?", [id]);
if (rows.length === 0) {
return res.status(404).json({ message: "User tidak ditemukan" });
}
res.json(rows[0]);
} catch (error) {
res.status(500).json({ message: error.message });
}
});
// UPDATE
router.put("/:id", async (req, res) => {
try {
const { id } = req.params;
const { name, email, age } = req.body;
const sql = "UPDATE users SET name = ?, email = ?, age = ? WHERE id = ?";
const [result] = await db.execute(sql, [name, email, age, id]);
if (result.affectedRows === 0) {
return res.status(404).json({ message: "User tidak ditemukan" });
}
res.json({ message: "User berhasil diperbarui" });
} catch (error) {
res.status(500).json({ message: error.message });
}
});
// DELETE
router.delete("/:id", async (req, res) => {
try {
const { id } = req.params;
const [result] = await db.execute("DELETE FROM users WHERE id = ?", [id]);
if (result.affectedRows === 0) {
return res.status(404).json({ message: "User tidak ditemukan" });
}
res.json({ message: "User berhasil dihapus" });
} catch (error) {
res.status(500).json({ message: error.message });
}
});
module.exports = router;7. Menjalankan Server
Jalankan server dengan perintah:
node server.jsJika berhasil, terminal akan menampilkan:
✅ Database connected!
🚀 Server running at http://localhost:30008. Uji API dengan Postman / Thunder Client
Gunakan Postman untuk mengetes endpoint berikut:
MetodeEndpointKeteranganGET/api/usersAmbil semua dataGET/api/users/:idAmbil data berdasarkan IDPOST/api/usersTambah data baruPUT/api/users/:idUbah dataDELETE/api/users/:idHapus data
Contoh body untuk POST:
{
"name": "John Doe",
"email": "john@example.com",
"age": 25
}9. Kesimpulan
Dengan kombinasi Node.js, Express, dan MySQL, kamu bisa membuat REST API CRUD yang cepat, fleksibel, dan mudah dikembangkan. Struktur ini juga cocok untuk diintegrasikan dengan frontend modern seperti React, Vue, atau Flutter.
💡 Tips: Setelah API ini stabil, kamu bisa menambahkan fitur seperti validasi data, autentikasi JWT, atau pagination agar lebih lengkap dan siap produksi.
Bagikan Artikel Ini