Episode ini membahas pengelolaan state: perbedaan aplikasi stateless dan stateful, session server-side dengan express-session, caching dengan Redis, serta header cache HTTP untuk mempercepat respons berulang.

Server HTTP idealnya stateless — setiap request berdiri sendiri dan tidak bergantung pada request sebelumnya. Kenyataannya, aplikasi butuh mengingat sesuatu: keranjang belanja, status login, data yang sering diminta. Di sinilah state server-side, session, dan caching berperan.
Episode 16 menjelaskan tiga lapis state: perbedaan aplikasi stateless dan stateful, session server-side dengan express-session, caching dengan Redis untuk data yang sering diakses, dan header cache HTTP agar respons berulang tidak perlu diproses ulang.
Aplikasi stateless menempatkan seluruh state di request itu sendiri — biasanya lewat token seperti JWT dari episode 11. Keuntungannya besar: server mana pun bisa melayani request apa pun, sehingga scaling horizontal menjadi sederhana dan restart server tidak menghapus data pengguna.
const payload = jwt.verify(token, process.env.JWT_SECRET);
const pengguna = await cariPengguna(payload.userId);jwt.verify(token, ...) mengembalikan identitas tanpa perlu menyimpan sesi di server. Request membawa semuanya sendiri. Ini pola favorit untuk API modern.
Sebagian state tetap hidup lebih baik di server: session login yang bisa dicabut kapan saja, rate limiter per pengguna, atau antrean pekerjaan. Ketika state disimpan di server, identitas request ditandai dengan ID yang unik — biasanya lewat cookie. Episode 11 dan 16 ini adalah dua ujung dari spektrum: JWT untuk stateless, session untuk stateful.
express-session menyimpan session di server dan mengirim cookie berisi ID ke browser:
npm install express-sessionnpm install express-session menambahkan middleware session. Di produksi, pasang store Redis agar session bisa dibagikan antar instance server.
import session from "express-session";
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: { secure: process.env.NODE_ENV === "production", httpOnly: true },
}),
);
app.post("/login", (req, res) => {
req.session.userId = 42;
res.json({ status: "success" });
});
app.get("/profil", (req, res) => {
if (!req.session.userId) {
return res.status(401).json({ error: "Belum login" });
}
res.json({ userId: req.session.userId });
});req.session.userId = 42 menyimpan data session, dan req.session bertahan antar request melalui cookie. Atribut httpOnly: true mencegah JavaScript browser membaca cookie, dan secure: true memaksa HTTPS di produksi. Session bisa dihapus kapan saja oleh server — keunggulan dibanding JWT yang hanya bisa berakhir lewat waktu.
Redis adalah in-memory database yang sering dipakai sebagai cache. Data yang mahal untuk dihitung atau diambil dari database disimpan sementara, sehingga request berikutnya melompati pemrosesan:
npm install redisnpm install redis menambahkan klien Redis resmi untuk Node.js. Redis menyimpan pasangan key-value di memori, sehingga baca-tulisnya jauh lebih cepat daripada query database.
Pola paling umum adalah cache-aside: cek cache dulu; jika kosong, ambil dari database dan isi cache:
import { createClient } from "redis";
const redis = createClient({ url: process.env.REDIS_URL });
await redis.connect();
async function ambilArtikel(id) {
const cache = await redis.get("artikel:" + id);
if (cache) return JSON.parse(cache);
const artikel = await cariArtikelDb(id);
await redis.set("artikel:" + id, JSON.stringify(artikel), { EX: 300 });
return artikel;
}redis.get("artikel:" + id) membaca cache; jika ada, langsung dikembalikan. Jika tidak, data diambil dari database lalu disimpan dengan EX: 300 (kedaluwarsa 300 detik). Perhatikan key dengan prefix artikel: untuk menghindari bentrok antar jenis data.
Selain cache di aplikasi, HTTP sendiri punya mekanisme cache lewat header. Set respons dengan kontrol cache agar client dan proxy tahu data mana yang bisa disimpan:
app.get("/api/kota", (req, res) => {
res.setHeader("Cache-Control", "public, max-age=3600");
res.json(daftarKota);
});res.setHeader("Cache-Control", "public, max-age=3600") memberi tahu browser dan CDN bahwa respons aman disalin selama satu jam. Untuk data pribadi, gunakan private atau no-store. Memadukan cache-aside di Redis dan header HTTP bisa mengurangi beban database secara drastis.
Mulailah stateless, tambahkan session hanya jika benar-benar perlu, dan tambahkan cache setelah mengukur bahwa database menjadi hambatan. Optimasi prematur biasanya membawa kompleksitas tanpa manfaat.
Inti yang harus dibawa pulang:
express-session menyimpan session dan mengirim cookie ID.httpOnly dan secure di produksi.Cache-Control mengatur cache di browser dan CDN.Di episode 17 selanjutnya kita akan membahas pengelolaan file upload dan streaming media — memproses multipart form dengan multer, membatasi ukuran dan tipe file, streaming file dari disk, serta mendukung range request untuk media. API kalian akan siap melayani file dan media sungguhan.