Setiap interaksi di Express.js berputar di sekitar dua objek: req (request) dan res (response). Objek req berisi semua informasi dari klien — body, parameter, header, cookie — sementara res adalah kendaraan untuk mengirim data kembali ke klien.
Memahami kedua objek ini secara mendalam adalah kunci untuk membangun API yang baik.
Objek Request (req)
req.params — Route Parameters
app.get('/pengguna/:id/postingan/:postId', (req, res) => {
console.log(req.params);
// { id: '5', postId: '12' }
});
req.query — Query String
// URL: /produk?kategori=elektronik&halaman=2&urutan=harga
app.get('/produk', (req, res) => {
console.log(req.query);
// { kategori: 'elektronik', halaman: '2', urutan: 'harga' }
const halaman = parseInt(req.query.halaman) || 1;
const limit = parseInt(req.query.limit) || 10;
const offset = (halaman - 1) * limit;
res.json({ halaman, limit, offset });
});
req.body — Request Body
Butuh middleware express.json() atau express.urlencoded() terlebih dahulu:
app.use(express.json());
app.post('/pengguna', (req, res) => {
const { nama, email, password } = req.body;
res.status(201).json({ pesan: 'Pengguna dibuat', nama });
});
req.headers — HTTP Headers
app.get('/info', (req, res) => {
const contentType = req.headers['content-type'];
const userAgent = req.headers['user-agent'];
const auth = req.headers['authorization'];
res.json({ contentType, userAgent, auth });
});
req.cookies — Cookies
Butuh middleware cookie-parser:
const cookieParser = require('cookie-parser');
app.use(cookieParser());
app.get('/dashboard', (req, res) => {
const sesiId = req.cookies.sessionId;
res.send(`Sesi ID: ${sesiId}`);
});
Properti Berguna Lainnya
req.method // 'GET', 'POST', 'PUT', dll.
req.url // URL lengkap dengan query string
req.originalUrl // URL asli sebelum dimodifikasi middleware
req.path // Hanya path tanpa query string
req.hostname // Nama host dari header Host
req.ip // IP address klien
req.protocol // 'http' atau 'https'
req.secure // true jika HTTPS
req.xhr // true jika XMLHttpRequest (AJAX)
Objek Response (res)
res.send() — Kirim Response Umum
res.send('Teks biasa');
res.send('<h1>HTML</h1>');
res.send({ key: 'value' }); // otomatis jadi JSON
res.send(Buffer.from('data biner'));
res.json() — Kirim JSON
res.json({ berhasil: true, data: [] });
res.status(201).json({ pesan: 'Dibuat', id: 5 });
res.status(400).json({ error: 'Permintaan tidak valid' });
res.status() — Set HTTP Status Code
res.status(200).json({ ok: true });
res.status(201).json({ pesan: 'Dibuat' });
res.status(400).json({ error: 'Bad Request' });
res.status(401).json({ error: 'Unauthorized' });
res.status(403).json({ error: 'Forbidden' });
res.status(404).json({ error: 'Tidak Ditemukan' });
res.status(500).json({ error: 'Server Error' });
res.redirect() — Redirect
res.redirect('/login');
res.redirect(301, 'https://url-baru.com'); // permanent redirect
res.redirect('back'); // kembali ke halaman sebelumnya
res.sendFile() — Kirim File
const path = require('path');
app.get('/download', (req, res) => {
res.sendFile(path.join(__dirname, 'files', 'dokumen.pdf'));
});
res.download() — Download File
app.get('/download/laporan', (req, res) => {
res.download('./laporan.pdf', 'laporan-bulanan.pdf');
// Parameter kedua adalah nama file yang tampil di browser
});
res.set() — Set Header
res.set('Content-Type', 'application/json');
res.set('X-Custom-Header', 'nilai-kustom');
res.set({
'Cache-Control': 'no-cache',
'X-Powered-By': 'Express'
});
res.cookie() — Set Cookie
res.cookie('sessionId', 'abc123', {
httpOnly: true,
secure: true,
maxAge: 24 * 60 * 60 * 1000 // 1 hari dalam ms
});
res.json({ login: true });
Contoh: Handler API yang Lengkap
app.use(express.json());
app.post('/artikel', async (req, res) => {
try {
// Baca dari body
const { judul, konten, kategori } = req.body;
// Validasi
if (!judul || !konten) {
return res.status(422).json({
error: 'Judul dan konten wajib diisi'
});
}
// Proses (simulasi save ke database)
const artikel = { id: Date.now(), judul, konten, kategori };
// Kirim response sukses
res.status(201)
.set('X-Resource-Id', artikel.id)
.json({
berhasil: true,
pesan: 'Artikel berhasil dibuat',
data: artikel
});
} catch (err) {
res.status(500).json({ error: 'Terjadi kesalahan server' });
}
});
Kesimpulan
req dan res adalah dua objek yang akan selalu kamu gunakan di setiap handler Express. Semakin familiar kamu dengan properti dan method keduanya, semakin efisien kamu membangun API. Di artikel berikutnya, kita akan masuk ke topik yang sangat penting: membangun RESTful API dengan Express.js.
Kiki/🎮🍉⌨️🍩💻