Modul 3.3 – REST API Dasar dengan Node.js (Express, tanpa Database)
Di modul ini kamu akan membangun REST API sederhana menggunakan Node.js + Express, dengan data yang masih disimpan di memory (array).
Fokusnya:
- Memahami struktur dasar REST API.
- Membuat server HTTP dengan Express.
- Membuat endpoint CRUD sederhana (
GET,POST,PUT,DELETE). - Mencoba memanggil API menggunakan tool seperti Postman / Bruno / curl.
Ini adalah jembatan penting sebelum nanti kamu menambahkan database di modul berikutnya.
1. Apa itu REST API (Recap Singkat)
Di modul 3.1 kamu sudah kenalan dengan API dan HTTP request–response. Di sini kita fokus ke REST API, yaitu gaya desain API yang:
- Menggunakan HTTP method sebagai cara operasi:
GET→ baca dataPOST→ buat data baruPUT/PATCH→ update dataDELETE→ hapus data
- Menggunakan URL untuk merepresentasikan resource:
/api/tasks,/api/users,/api/posts, dll.
Contoh desain endpoint untuk resource tasks:
| Method | Endpoint | Fungsi |
|---|---|---|
GET |
/api/tasks |
Ambil semua task |
GET |
/api/tasks/:id |
Ambil satu task |
POST |
/api/tasks |
Buat task baru |
PUT |
/api/tasks/:id |
Update task |
DELETE |
/api/tasks/:id |
Hapus task |
Di modul ini kita akan mengimplementasikan pola seperti itu.
2. Setup Project Express
Kita mulai dari project baru khusus untuk API ini.
- Buat folder baru:
mkdir belajar-express-api
cd belajar-express-api
- Inisialisasi project Node.js:
npm init -y
- Install Express (framework web untuk Node.js):
npm install express
- Buat file
index.js:
touch index.js
- Isi
index.jsdengan kode server dasar:
// index.js
const express = require("express");
const app = express();
const PORT = 3000;
// Middleware agar Express bisa membaca JSON di body request
app.use(express.json());
// Route dasar untuk cek server
app.get("/", (req, res) => {
res.json({ message: "API is running 🚀" });
});
app.listen(PORT, () => {
console.log(`Server berjalan di http://localhost:${PORT}`);
});
- Tambahkan script di
package.jsonsupaya gampang dijalankan:
{
"name": "belajar-express-api",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.19.0"
}
}
- Jalankan server:
npm run start
Buka http://localhost:3000 di browser, kamu harus melihat respons JSON:
{ "message": "API is running 🚀" }
3. Menyimpan Data di Memory (Tanpa Database)
Sebelum pakai database beneran, kita akan simpan data di array.
Tambahkan kode berikut di index.js, di atas route /:
// Data dummy in-memory (hilang kalau server di-restart)
let tasks = [
{ id: 1, title: "Belajar Node.js", completed: false },
{ id: 2, title: "Membangun REST API", completed: false }
];
let nextId = 3;
Kita akan membuat endpoint untuk mengelola tasks ini.
4. Endpoint: GET /api/tasks (Read All)
Tambahkan route berikut setelah route /:
// GET /api/tasks - ambil semua task
app.get("/api/tasks", (req, res) => {
res.json(tasks);
});
Coba akses:
- Browser:
http://localhost:3000/api/tasks - Atau dengan curl:
curl http://localhost:3000/api/tasks
Kamu akan dapat list task dalam bentuk JSON.
5. Endpoint: GET /api/tasks/:id (Read One)
// GET /api/tasks/:id - ambil satu task berdasarkan id
app.get("/api/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const task = tasks.find((t) => t.id === id);
if (!task) {
return res.status(404).json({ error: "Task tidak ditemukan" });
}
res.json(task);
});
Coba:
curl http://localhost:3000/api/tasks/1
curl http://localhost:3000/api/tasks/999
Kalau id tidak ada, API akan mengembalikan status 404.
6. Endpoint: POST /api/tasks (Create)
Sekarang kita tambahkan endpoint untuk menambah task baru.
// POST /api/tasks - buat task baru
app.post("/api/tasks", (req, res) => {
const { title } = req.body;
if (!title) {
return res.status(400).json({ error: "Field 'title' wajib diisi" });
}
const newTask = {
id: nextId++,
title,
completed: false
};
tasks.push(newTask);
res.status(201).json(newTask);
});
Coba kirim request dengan Postman / Bruno:
- Method:
POST - URL:
http://localhost:3000/api/tasks - Body (JSON):
{
"title": "Belajar Express"
}
Atau dengan curl:
curl -X POST http://localhost:3000/api/tasks \
-H "Content-Type: application/json" \
-d '{"title": "Belajar Express"}'
Respons:
{
"id": 3,
"title": "Belajar Express",
"completed": false
}
7. Endpoint: PUT /api/tasks/:id (Update)
Sekarang kita buat endpoint untuk mengubah task, misalnya mengubah judul atau status completed.
// PUT /api/tasks/:id - update task
app.put("/api/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const { title, completed } = req.body;
const taskIndex = tasks.findIndex((t) => t.id === id);
if (taskIndex === -1) {
return res.status(404).json({ error: "Task tidak ditemukan" });
}
// Update hanya field yang dikirim
if (title !== undefined) {
tasks[taskIndex].title = title;
}
if (completed !== undefined) {
tasks[taskIndex].completed = Boolean(completed);
}
res.json(tasks[taskIndex]);
});
Contoh request (Postman / Bruno):
- Method:
PUT - URL:
http://localhost:3000/api/tasks/1 - Body (JSON):
{
"completed": true
}
8. Endpoint: DELETE /api/tasks/:id (Delete)
Terakhir, kita tambahkan endpoint untuk menghapus task.
// DELETE /api/tasks/:id - hapus task
app.delete("/api/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const taskIndex = tasks.findIndex((t) => t.id === id);
if (taskIndex === -1) {
return res.status(404).json({ error: "Task tidak ditemukan" });
}
const deletedTask = tasks[taskIndex];
tasks.splice(taskIndex, 1);
res.json({ message: "Task berhasil dihapus", task: deletedTask });
});
Contoh request:
curl -X DELETE http://localhost:3000/api/tasks/1
9. Struktur Akhir index.js
Untuk memudahkan, berikut isi lengkap index.js yang sudah berisi semua endpoint:
// index.js
const express = require("express");
const app = express();
const PORT = 3000;
// Middleware untuk parsing JSON
app.use(express.json());
// Data dummy in-memory
let tasks = [
{ id: 1, title: "Belajar Node.js", completed: false },
{ id: 2, title: "Membangun REST API", completed: false }
];
let nextId = 3;
// Route dasar
app.get("/", (req, res) => {
res.json({ message: "API is running 🚀" });
});
// GET /api/tasks - ambil semua task
app.get("/api/tasks", (req, res) => {
res.json(tasks);
});
// GET /api/tasks/:id - ambil satu task
app.get("/api/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const task = tasks.find((t) => t.id === id);
if (!task) {
return res.status(404).json({ error: "Task tidak ditemukan" });
}
res.json(task);
});
// POST /api/tasks - buat task baru
app.post("/api/tasks", (req, res) => {
const { title } = req.body;
if (!title) {
return res.status(400).json({ error: "Field 'title' wajib diisi" });
}
const newTask = {
id: nextId++,
title,
completed: false
};
tasks.push(newTask);
res.status(201).json(newTask);
});
// PUT /api/tasks/:id - update task
app.put("/api/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const { title, completed } = req.body;
const taskIndex = tasks.findIndex((t) => t.id === id);
if (taskIndex === -1) {
return res.status(404).json({ error: "Task tidak ditemukan" });
}
if (title !== undefined) {
tasks[taskIndex].title = title;
}
if (completed !== undefined) {
tasks[taskIndex].completed = Boolean(completed);
}
res.json(tasks[taskIndex]);
});
// DELETE /api/tasks/:id - hapus task
app.delete("/api/tasks/:id", (req, res) => {
const id = Number(req.params.id);
const taskIndex = tasks.findIndex((t) => t.id === id);
if (taskIndex === -1) {
return res.status(404).json({ error: "Task tidak ditemukan" });
}
const deletedTask = tasks[taskIndex];
tasks.splice(taskIndex, 1);
res.json({ message: "Task berhasil dihapus", task: deletedTask });
});
app.listen(PORT, () => {
console.log(`Server berjalan di http://localhost:${PORT}`);
});
10. Menghubungkan ke Modul Berikutnya
Dengan modul 3.3 ini, kamu sudah:
- Membuat server HTTP dengan Express.
- Membuat endpoint REST API dasar (CRUD) untuk resource
tasks. - Mencoba mengakses API dengan browser / Postman / curl.
Di modul berikutnya (Modul 4 – Database & CRUD), kamu akan:
- Memindahkan data dari array in-memory ke database beneran (misalnya PostgreSQL / Supabase).
- Tetap menggunakan pola endpoint yang sama, tapi sekarang datanya persisten (tidak hilang saat server restart).
Referensi lebih lanjut: