Menu

HTTP Server Node.js: http.createServer dengan Contoh

http.createServer() menerima satu fungsi yang berjalan untuk setiap request dengan req dan res. Kamu membaca method dan URL dari req, lalu mengatur status, header, dan body di res dan memanggil res.end().

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

http.createServer() membuat web server dari satu fungsi, yaitu request handler, yang dipanggil Node untuk setiap request yang masuk dengan dua object: req (method, URL, dan header yang dikirim client) dan res (apa yang kamu kirim balik). Atur status code dan header di res, lalu panggil res.end() dengan body-nya. server.listen(3000) mulai menerima koneksi di port 3000.

Request pertama menjawab You asked for GET /hello?name=Ada, dan Console mencatat method dan URL yang sama. Kirim DELETE /anything dari request bar: handler yang sama menjawabnya, karena server http polos tidak punya route. Setiap request melewati satu fungsi itu.

Mengirim JSON dan mengatur status code

res.writeHead(status, headers) mengatur status code dan header dalam satu panggilan. Untuk JSON, atur Content-Type: application/json dan kirim hasil JSON.stringify(); res.end() hanya menerima string atau Buffer.

GET /users?limit=1 mengembalikan [{"id":1,"name":"Ada"}]. req.url adalah path ditambah query string, jadi new URL(req.url, 'http://localhost') memecahnya menjadi pathname dan searchParams (base-nya ada hanya karena URL butuh alamat absolut). Kirim GET /nothing dan status-nya berubah menjadi 404.

Routing request dengan switch

API kecil tidak butuh lebih dari switch pada method dan path. Susun kunci seperti 'GET /users' dan beri setiap route case-nya sendiri:

Kirim POST /users dengan body {"name": "Grace"}: jawabannya 201 dengan {"id":2,"name":"Grace"}, dan GET /users sekarang menampilkan kedua user. Kirim POST yang sama dengan body hello dan kamu mendapat 400 dengan {"error":"Body must be JSON"}.

Membaca body POST

Node tidak mem-parse body untukmu. req adalah readable stream, dan body-nya tiba dalam potongan lewat event data, lalu end terpancar setelah lengkap. readBody() di atas mengumpulkan potongan-potongannya menjadi string dan mengembalikan promise, jadi handler bisa meng-await-nya. Karena req adalah async iterable, perulangan ini melakukan pekerjaan yang sama:

let data = '';
for await (const chunk of req) data += chunk;
const body = JSON.parse(data);

Server sungguhan juga membatasi ukurannya (berhenti membaca dan menjawab 413 saat data.length melewati batas) dan mengecek req.headers['content-type'] sebelum memanggil JSON.parse.

Kesalahan umum

Lupa res.end(). Cabang yang mengatur status tetapi tidak pernah mengakhiri response membuat client menunggu sampai timeout.

Mengatur header setelah body. Begitu res.end() atau res.write() pertama sudah berjalan, header-nya sudah terkirim, dan res.setHeader() melempar ERR_HTTP_HEADERS_SENT. Pakai return saat kamu mengirim response lebih awal, seperti di contoh-contohnya.

Membandingkan req.url dengan path. req.url menyertakan query string, jadi req.url === '/users' bernilai false untuk /users?limit=1. Bandingkan pathname.

Kapan memakai Express

Module http sudah cukup untuk health check, penerima webhook, atau mempelajari cara kerja HTTP. Begitu kamu butuh parameter route seperti /users/:id, parsing body JSON, middleware, dan penanganan error, kamu akhirnya menulis framework kecilmu sendiri. Express adalah framework itu, dibangun di atas object req dan res yang sama; routing Express menunjukkan API yang sama dengan app.get() dan app.post().

Pertanyaan yang sering diajukan

Apa bedanya res.write dan res.end?

res.write() mengirim satu potongan body dan membiarkan response tetap terbuka, jadi bisa kamu panggil berkali-kali. res.end() mengirim potongan terakhir yang opsional dan menyelesaikan response. Setiap response butuh tepat satu res.end().

Bagaimana cara menghentikan HTTP server Node?

Panggil server.close(). Fungsi ini langsung berhenti menerima koneksi baru dan menjalankan callback-nya setelah koneksi yang terbuka selesai, persis yang dibutuhkan untuk shutdown yang rapi saat SIGTERM.

Bagaimana memakai HTTPS dengan module http?

Pakai module https: https.createServer({ key, cert }, handler) menerima handler yang sama ditambah private key dan sertifikat. Di production, biasanya proxy seperti Nginx atau platform hosting yang menangani TLS, dan server Node-mu tetap listen di HTTP biasa.

Server Node sebaiknya listen di port berapa?

Port kosong mana pun di atas 1024 bisa dipakai tanpa hak admin; 3000 dan 8080 umum dipakai saat development. Platform hosting biasanya memberi tahu port-nya lewat environment variable, jadi tulis server.listen(process.env.PORT || 3000).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai