Dalam mengembangkan aplikasi web modern berbasis Node.js, Express.js telah menjadi framework pilihan utama bagi banyak developer. Fleksibilitas dan minimalisnya memungkinkan kita membangun RESTful API, server web, hingga aplikasi full-stack dengan cepat. Namun, kekuatan sejati Express.js seringkali terletak pada sistem middleware-nya yang modular dan powerful.
Middleware adalah fungsi yang memiliki akses ke objek permintaan (request), objek respons (response), dan fungsi middleware berikutnya dalam siklus permintaan-respons aplikasi. Fungsi middleware ini bisa melakukan banyak hal: memproses data permintaan, menjalankan kode, memodifikasi objek permintaan dan respons, hingga mengakhiri siklus permintaan-respons.
Tanpa middleware, aplikasi Express.js akan terasa sangat kosong dan kurang fungsional. Middleware inilah yang menambahkan berbagai fitur esensial mulai dari parsing data, otentikasi, otorisasi, logging, keamanan, hingga penanganan file. Tapi, dari sekian banyak pilihan, middleware mana saja yang benar-benar menjadi "must-have" bagi developer? Artikel ini akan membahas middleware Express.js yang paling sering digunakan, lengkap dengan mengapa ia penting dan bagaimana developer menggunakannya dalam praktiknya.
Mengapa Middleware Sangat Penting dalam Pengembangan Express.js?
Middleware adalah jantung dari arsitektur aplikasi Express.js yang modern dan efisien. Ia menyediakan cara yang bersih dan terstruktur untuk memisahkan berbagai tugas lintas fungsional yang diperlukan oleh hampir setiap permintaan yang masuk ke server Anda. Bayangkan harus menulis logika otentikasi atau parsing body di setiap route handler Anda; itu akan sangat berulang, sulit di-maintain, dan rawan kesalahan. Middleware mengatasi masalah ini dengan memungkinkan kita untuk:
- Modularitas: Setiap middleware memiliki tanggung jawab tunggal, membuat kode lebih mudah dipahami dan diuji.
- Reusability: Middleware yang sama dapat diterapkan di banyak route atau bahkan di seluruh aplikasi.
- Keteraturan Proses: Middleware memungkinkan Anda untuk menentukan urutan eksekusi logika, memastikan setiap permintaan melewati serangkaian proses yang telah ditentukan sebelum mencapai handler utama.
- Peningkatan Keamanan: Banyak middleware dirancang khusus untuk menangani aspek keamanan seperti CORS, XSS, dan CSRF.
- Debugging Lebih Mudah: Dengan memisahkan logika, ketika ada masalah, Anda tahu di mana harus mencarinya.
Pada dasarnya, middleware adalah fondasi yang memungkinkan developer membangun aplikasi Express.js yang kompleks, terukur, dan aman tanpa harus mengulang kode atau mengorbankan kualitas. Mari kita telusuri middleware apa saja yang wajib Anda kenali dan gunakan.
Middleware Express.js Paling Esensial yang Sering Digunakan
Berikut adalah daftar middleware yang secara rutin ditemukan dalam proyek Express.js modern. Memahami dan menguasai penggunaan middleware ini adalah kunci untuk menjadi developer Express.js yang handal.
1. express.json() dan express.urlencoded()
Ini adalah dua middleware bawaan dari Express.js yang menjadi fondasi untuk setiap API RESTful. Fungsi utamanya adalah untuk mem-parsing body permintaan yang masuk.
Apa itu dan Mengapa Penting?
Ketika klien (misalnya, aplikasi frontend atau aplikasi mobile) mengirimkan data ke server melalui metode POST, PUT, atau PATCH, data tersebut biasanya ada di dalam "body" permintaan. Format data yang umum adalah JSON (untuk API) atau URL-encoded (untuk form HTML tradisional).
express.json(): Mem-parsing permintaan dengan payload JSON. Ini sangat umum untuk API modern. Setelah di-parse, data JSON tersedia direq.body.express.urlencoded({ extended: true }): Mem-parsing permintaan dengan payload URL-encoded. Opsiextended: truememungkinkan parsing objek dan array bersarang dari string URL-encoded. Ini penting untuk form HTML yang kompleks.
Tanpa middleware ini, req.body akan selalu undefined, dan Anda harus mem-parsing data secara manual, yang sangat merepotkan dan rawan kesalahan. Ini adalah salah satu middleware pertama yang akan Anda tambahkan ke aplikasi Express.js baru.
Contoh Penggunaan:
Anda cukup menempatkannya di awal file aplikasi Anda:
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
2. Morgan (Logging HTTP Request)
Morgan adalah middleware logging HTTP request yang sangat populer. Ini memberikan insight yang cepat dan mudah tentang permintaan yang masuk ke server Anda.
Apa itu dan Mengapa Penting?
Saat mengembangkan atau mendeploy aplikasi, melihat log permintaan adalah hal fundamental. Morgan memungkinkan Anda untuk melihat siapa yang mengakses endpoint mana, dengan metode apa, status responsnya, berapa lama waktu yang dibutuhkan, dan berapa ukuran responsnya. Informasi ini sangat berharga untuk:
- Debugging: Dengan cepat mengidentifikasi permintaan yang bermasalah.
- Monitoring: Memahami pola penggunaan aplikasi Anda.
- Performance Testing: Melihat waktu respons untuk setiap permintaan.
Morgan juga menawarkan berbagai format log yang dapat dikustomisasi, mulai dari yang sederhana ("tiny") hingga yang lebih detail ("combined").
Contoh Penggunaan:
Instalasi:
npm install morgan --save
Penggunaan:
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('dev')); // 'dev' adalah format log yang ringkas dan berwarna untuk lingkungan pengembangan
Untuk lingkungan produksi, sering digunakan format "combined" atau "common" dan diarahkan ke file log.
3. Helmet (Keamanan HTTP Header)
Helmet adalah kumpulan middleware yang membantu mengamankan aplikasi Express.js dengan mengatur berbagai header HTTP yang relevan dengan keamanan.
Apa itu dan Mengapa Penting?
Aplikasi web modern rentan terhadap berbagai serangan seperti XSS (Cross-Site Scripting), CSRF (Cross-Site Request Forgery), clickjacking, dan lainnya. Helmet tidak secara langsung mencegah semua serangan ini, tetapi ia menambahkan lapisan pertahanan dengan mengatur header HTTP yang tepat, yang memberitahu browser tentang bagaimana harus berperilaku. Misalnya:
X-Content-Type-Optionsuntuk mencegah MIME-sniffing.X-Frame-Optionsuntuk mencegah clickjacking.X-XSS-Protectionuntuk mengaktifkan filter XSS bawaan browser.Strict-Transport-Securityuntuk memastikan koneksi HTTPS.Content-Security-Policyuntuk mencegah serangan XSS dan injeksi data lainnya.
Menggunakan Helmet adalah langkah awal yang sangat mudah namun signifikan untuk meningkatkan keamanan aplikasi Express.js Anda. Ini adalah salah satu "best practice" yang paling direkomendasikan.
Contoh Penggunaan:
Instalasi:
npm install helmet --save
Penggunaan:
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet()); // Mengaktifkan semua middleware Helmet secara default
4. CORS (Cross-Origin Resource Sharing)
Middleware CORS digunakan untuk menangani permintaan cross-origin, yang merupakan batasan keamanan browser.
Apa itu dan Mengapa Penting?
Secara default, browser membatasi permintaan HTTP yang dibuat dari satu "origin" (kombinasi protokol, host, dan port) ke "origin" yang berbeda. Ini adalah kebijakan keamanan yang disebut Same-Origin Policy. Namun, dalam pengembangan aplikasi modern, sangat umum jika frontend (misalnya, React App di http://localhost:3000) ingin berkomunikasi dengan backend (misalnya, Express API di http://localhost:5000). Dalam kasus ini, Anda perlu mengizinkan permintaan cross-origin.
Middleware cors menyediakan cara yang mudah untuk mengonfigurasi header HTTP Access-Control-Allow-Origin, serta header lainnya seperti Access-Control-Allow-Methods dan Access-Control-Allow-Headers, yang memberitahu browser bahwa permintaan dari origin tertentu diizinkan.
Tanpa CORS yang dikonfigurasi dengan benar, aplikasi frontend Anda tidak akan bisa berkomunikasi dengan API Anda, yang akan menyebabkan error di konsol browser.
Contoh Penggunaan:
Instalasi:
npm install cors --save
Penggunaan:
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors()); // Mengizinkan semua permintaan cross-origin
Untuk produksi, disarankan untuk mengonfigurasi CORS hanya untuk origin yang spesifik:
app.use(cors({
origin: 'https://aplikasaya.com',
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
Middleware ini mem-parsing header cookie dari permintaan dan mengisi req.cookies dengan objek yang berisi nama dan nilai cookie.
Apa itu dan Mengapa Penting?
Cookie adalah bagian fundamental dari banyak aplikasi web untuk menyimpan informasi sesi, preferensi pengguna, atau data pelacakan. Tanpa cookie-parser, Anda harus mem-parsing string header Cookie secara manual dari req.headers, yang bisa jadi rumit.
cookie-parser menyederhanakan proses ini dengan menyediakan akses langsung ke cookie sebagai objek JavaScript. Ini sangat berguna jika Anda bekerja dengan autentikasi berbasis cookie, sesi pengguna, atau fitur personalisasi lainnya yang mengandalkan cookie.
Contoh Penggunaan:
Instalasi:
npm install cookie-parser --save
Penggunaan:
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
Setelah itu, Anda bisa mengakses cookie:
app.get('/', (req, res) => {
console.log('Cookies: ', req.cookies);
res.send('Lihat konsol untuk cookie!');
});
6. Express-Session (Manajemen Sesi)
express-session adalah middleware untuk manajemen sesi yang memungkinkan Anda menyimpan data sesi di server dan mengidentifikasi pengunjung unik melalui cookie.
Apa itu dan Mengapa Penting?
Sesi sangat penting untuk menjaga status pengguna antar permintaan HTTP yang stateless. Misalnya, ketika pengguna login, Anda ingin server mengingat siapa mereka di setiap halaman yang mereka kunjungi. Daripada mengirimkan kredensial di setiap permintaan, Anda menyimpan ID sesi di cookie browser pengguna, dan ID sesi itu akan digunakan server untuk mencari data sesi yang sesuai (misalnya, user_id, status login, keranjang belanja).
express-session menyediakan API yang mudah untuk mengelola sesi, seperti menyimpan data ke req.session, menghapus sesi, atau memperbaruinya. Meskipun cookie-parser hanya membaca cookie, express-session menggunakan cookie untuk mengelola data sisi server, memberikan keamanan dan skalabilitas lebih baik untuk data sensitif.
Contoh Penggunaan:
Instalasi:
npm install express-session --save
Penggunaan:
const express = require('express');
const session = require('express-session');
const app = express();
app.use(session({
secret: 'kunci_rahasia_anda_yang_sangat_panjang_dan_acak', // Wajib, untuk menandatangani session ID cookie
resave: false, // Jangan simpan sesi jika tidak ada perubahan
saveUninitialized: true, // Simpan sesi yang baru tapi belum diinisialisasi
cookie: { secure: false } // Set ke true jika menggunakan HTTPS di produksi
}));
app.get('/views', (req, res) => {
if (req.session.views) {
req.session.views++;
res.send(`Anda telah melihat halaman ini ${req.session.views} kali.`);
} else {
req.session.views = 1;
res.send('Selamat datang di kunjungan pertama Anda!');
}
});
7. Multer (Penanganan Upload File)
Multer adalah middleware yang dirancang khusus untuk menangani multipart/form-data, yang utamanya digunakan untuk mengunggah file.
Apa itu dan Mengapa Penting?
Jika aplikasi Anda memerlukan fitur upload gambar, dokumen, atau jenis file lainnya, Multer adalah solusi de-facto di ekosistem Express.js. Header Content-Type: multipart/form-data adalah standar untuk pengiriman file dari browser. Mem-parsing jenis permintaan ini secara manual sangat kompleks.
Multer menyederhanakan proses ini dengan mem-parsing data file, menyimpannya di lokasi yang Anda tentukan (baik di disk atau di memori), dan menyediakan akses ke informasi file melalui req.file atau req.files.
Ini adalah middleware yang tidak akan Anda gunakan di setiap proyek, tetapi ketika Anda membutuhkannya, Multer adalah penyelamat. Developer sangat menghargai kemudahannya dalam menangani upload file tunggal maupun banyak.
Contoh Penggunaan:
Instalasi:
npm install multer --save
Penggunaan:
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' }); // Simpan file yang diunggah di folder 'uploads/'
app.post('/upload-single', upload.single('avatar'), (req, res) => {
console.log(req.file); // Informasi tentang file yang diunggah
res.send('File berhasil diunggah!');
});
app.post('/upload-multiple', upload.array('photos', 12), (req, res) => {
console.log(req.files); // Informasi tentang banyak file yang diunggah
res.send('Banyak file berhasil diunggah!');
});
8. Compression (GZIP Compression)
Middleware compression digunakan untuk mengkompres respons HTTP menggunakan GZIP atau deflate.
Apa itu dan Mengapa Penting?
Ukuran payload respons HTTP dapat berdampak besar pada kinerja aplikasi web Anda. Semakin besar responsnya, semakin lama waktu yang dibutuhkan untuk mengunduhnya oleh klien, terutama pada koneksi internet yang lambat.
Middleware compression secara otomatis mengkompres data respons sebelum dikirim ke klien (jika browser klien mendukung kompresi), yang secara signifikan dapat mengurangi ukuran transfer data. Ini berarti waktu loading yang lebih cepat, pengalaman pengguna yang lebih baik, dan penggunaan bandwidth yang lebih efisien.
Meskipun server web seperti Nginx atau Apache juga dapat menangani kompresi, menggunakan middleware ini di Express.js memastikan bahwa semua respons dari aplikasi Node.js Anda dikompresi, memberikan optimasi yang mudah dan instan.
Contoh Penggunaan:
Instalasi:
npm install compression --save
Penggunaan:
const express = require('express');
const compression = require('compression');
const app = express();
app.use(compression()); // Kompres semua respons dari aplikasi
Tempatkan middleware ini di awal tumpukan middleware Anda untuk memastikan semua respons mendapatkan manfaat kompresi.
9. Custom Middleware
Selain middleware pihak ketiga, kemampuan untuk membuat custom middleware sendiri adalah salah satu fitur terkuat Express.js.
Apa itu dan Mengapa Penting?
Custom middleware adalah fungsi JavaScript biasa yang Anda tulis sendiri dan yang mengikuti pola middleware Express. Ini memungkinkan Anda untuk menambahkan logika spesifik aplikasi Anda di tengah siklus permintaan-respons.
Contoh penggunaan custom middleware meliputi:
- Otentikasi dan Otorisasi: Memeriksa token JWT atau sesi pengguna untuk memastikan mereka memiliki hak akses.
- Validasi Input: Memvalidasi data yang masuk dari
req.bodyataureq.query. - Modifikasi Objek Request/Response: Menambahkan properti kustom ke
reqatauresuntuk digunakan oleh handler berikutnya. - Penanganan Error Global: Middleware penanganan error khusus untuk menangkap dan merespons error yang tidak tertangani.
- Mengukur Waktu Eksekusi: Untuk tujuan monitoring atau debugging.
Kemampuan untuk menulis custom middleware memberikan fleksibilitas tak terbatas dan memungkinkan developer untuk menjaga kode mereka tetap DRY (Don’t Repeat Yourself) dan terorganisir.
Contoh Penggunaan:
function myLogger(req, res, next) {
console.log('LOGGED:', new Date().toISOString(), req.method, req.url);
next(); // Panggil next() untuk meneruskan kontrol ke middleware berikutnya
}
app.use(myLogger);
Pengalaman dan Pertimbangan Praktis Menggunakan Middleware Express.js
Sebagai seorang developer yang sering berkutat dengan Express.js, saya telah melihat bagaimana middleware ini diimplementasikan (dan terkadang disalahgunakan) dalam berbagai proyek. Ada beberapa pertimbangan praktis yang penting untuk diingat:
-
Urutan Middleware Itu Penting: Ini adalah salah satu pelajaran paling fundamental. Urutan Anda menempatkan
app.use()sangat memengaruhi bagaimana permintaan diproses. Misalnya,express.json()harus datang sebelum route handler yang membutuhkanreq.body. Middleware logging seperti Morgan harus diletakkan di awal agar bisa mencatat semua permintaan. Middleware keamanan seperti Helmet juga sebaiknya diletakkan di awal. - Kapan Menggunakan Global vs. Route-Specific Middleware: Tidak semua middleware perlu diterapkan di seluruh aplikasi. Untuk tugas seperti validasi input atau otorisasi yang spesifik untuk route tertentu, terapkan middleware langsung pada route tersebut atau sekelompok route. Ini menjaga efisiensi dan menghindari pemrosesan yang tidak perlu.
-
Penanganan Error dengan Middleware: Express.js memiliki cara khusus untuk middleware penanganan error. Mereka memiliki empat argumen
(err, req, res, next). Menempatkan middleware ini di akhir tumpukan adalah praktik terbaik untuk menangkap semua error yang mungkin terjadi. Dalam praktiknya, developer sering membuat middleware error handler kustom untuk memberikan respons error yang konsisten. -
Overhead Middleware: Meskipun middleware sangat berguna, terlalu banyak middleware atau middleware yang tidak efisien dapat menambah overhead pada setiap permintaan. Pertimbangkan apakah setiap middleware benar-benar diperlukan dan optimalkan konfigurasinya, terutama di lingkungan produksi. Misalnya, menggunakan
compressionatauhelmetadalah performa vs. keamanan yang sangat worth it. - Memahami Opsi Konfigurasi: Banyak middleware pihak ketiga menyediakan opsi konfigurasi yang luas. Jangan hanya menggunakan konfigurasi default. Baca dokumentasinya untuk menyesuaikannya dengan kebutuhan spesifik aplikasi Anda (misalnya, mengkonfigurasi origin di CORS atau opsi penyimpanan di Multer). Kesalahan konfigurasi bisa menjadi sumber kerentanan keamanan atau masalah fungsionalitas.
-
Keamanan Sesi dan Cookie: Saat menggunakan
cookie-parserdanexpress-session, pastikan untuk menggunakansecretyang kuat dan acak. Untukexpress-session, selalu setcookie: { secure: true }di lingkungan produksi dan pastikan Anda menggunakan HTTPS. Ini melindungi cookie sesi dari intersepsi.
Dengan mempertimbangkan poin-poin ini, Anda bisa merancang aplikasi Express.js yang lebih robust, aman, dan efisien.
Masalah yang Sering Terjadi Saat Menggunakan Middleware Express.js
Meskipun middleware Express.js sangat powerful, developer sering mengalami beberapa masalah umum. Berikut adalah beberapa di antaranya dan cara mengatasinya:
1. req.body Selalu undefined
Gejala: Ketika Anda mengirim permintaan POST atau PUT dengan data JSON atau form, properti req.body di route handler Anda selalu menunjukkan undefined.
Penyebab: Anda lupa menambahkan middleware body parsing, yaitu express.json() atau express.urlencoded(), atau Anda menempatkannya setelah route handler Anda.
Solusi: Pastikan Anda telah menggunakan app.use(express.json()); dan/atau app.use(express.urlencoded({ extended: true })); di awal file aplikasi Anda, sebelum definisi route apapun.
2. Error CORS: "No ‘Access-Control-Allow-Origin’ header is present"
Gejala: Aplikasi frontend Anda gagal melakukan permintaan ke API Express.js dengan error yang berhubungan dengan CORS di konsol browser.
Penyebab: Server Express.js Anda tidak mengizinkan permintaan dari origin frontend Anda. Ini bisa karena Anda tidak menggunakan middleware cors, atau Anda mengonfigurasinya dengan origin yang salah.
Solusi: Instal dan gunakan middleware cors. Untuk pengembangan, app.use(cors()); bisa digunakan untuk sementara. Untuk produksi, konfigurasikan secara spesifik:
app.use(cors({ origin: 'https://alamat-frontend-anda.com' }));
Pastikan juga metode HTTP dan header yang digunakan oleh frontend Anda diizinkan.
3. File Upload Gagal atau req.file/req.files undefined
Gejala: Ketika mencoba mengunggah file menggunakan form dengan enctype="multipart/form-data", Multer tidak memproses file, atau properti req.file/req.files tidak tersedia.
Penyebab: Anda lupa menyertakan middleware Multer pada route upload, atau nama input file (atribut name di HTML <input type="file">) tidak cocok dengan string yang Anda berikan ke metode upload.single() atau upload.array().
Solusi: Pastikan Anda telah menginstal Multer dan menambahkannya ke route yang menangani upload. Contoh:
app.post('/upload', upload.single('namaInputFileAnda'), (req, res) => { /* ... */ });
Pastikan 'namaInputFileAnda' sama persis dengan atribut name pada input file di form HTML Anda.
4. Sesi Tidak Persisten atau Tidak Dikenali
Gejala: Pengguna login, tetapi ketika mereka navigasi ke halaman lain, server tidak mengingat status login mereka, atau data req.session hilang.
Penyebab: Masalah konfigurasi express-session, seperti secret yang tidak valid, atau cookie yang tidak diatur dengan benar (misalnya, secure: true di HTTP, bukan HTTPS).
Solusi: Periksa kembali konfigurasi express-session Anda. Pastikan secret adalah string yang kuat dan unik. Jika Anda tidak menggunakan HTTPS, atur cookie: { secure: false } untuk pengembangan. Di produksi, dengan HTTPS, gunakan cookie: { secure: true }. Pastikan juga resave: false dan saveUninitialized: true digunakan dengan benar sesuai kebutuhan Anda.
FAQ
Apa itu middleware Express.js?
Middleware Express.js adalah fungsi yang memiliki akses ke objek permintaan (req), objek respons (res), dan fungsi middleware berikutnya (next) dalam siklus permintaan-respons aplikasi. Middleware dapat menjalankan kode, memodifikasi objek permintaan/respons, atau mengakhiri siklus permintaan.
Bagaimana cara kerja middleware Express.js?
Middleware bekerja dalam urutan linear. Setiap kali permintaan masuk, ia melewati satu per satu fungsi middleware yang terdaftar. Setiap middleware dapat melakukan tugasnya dan kemudian memanggil next() untuk meneruskan kontrol ke middleware berikutnya, atau mengakhiri permintaan dengan mengirim respons.
Apa perbedaan antara middleware global dan middleware spesifik rute?
Middleware global diterapkan ke setiap permintaan yang masuk ke aplikasi Anda (biasanya dengan app.use()). Middleware spesifik rute hanya diterapkan pada rute atau grup rute tertentu, memberikan kontrol lebih granular atas pemrosesan permintaan.
Apakah saya harus selalu menggunakan semua middleware yang disebutkan?
Tidak. Anda hanya perlu menggunakan middleware yang relevan dengan kebutuhan aplikasi Anda. Misalnya, jika Anda tidak menangani upload file, Anda tidak memerlukan Multer. Namun, express.json(), express.urlencoded(), helmet, dan cors (terutama untuk API) adalah hampir selalu menjadi standar dalam aplikasi modern.
Bisakah saya membuat middleware sendiri?
Tentu saja! Membuat custom middleware adalah praktik umum untuk menambahkan logika spesifik aplikasi Anda, seperti otentikasi kustom, validasi data, atau penanganan error unik. Ini adalah salah satu kekuatan utama dari Express.js.
Kesimpulan
Middleware adalah tulang punggung dari setiap aplikasi Express.js yang sukses. Mereka memungkinkan developer untuk mengorganisir kode, menambah fungsionalitas, dan memastikan aplikasi tetap aman dan efisien.
Dari mem-parsing body permintaan dengan express.json() dan express.urlencoded(), hingga mengamankan aplikasi dengan helmet, menangani permintaan cross-origin dengan cors, mengelola sesi dengan express-session, hingga menangani upload file dengan multer, setiap middleware memainkan peran krusial. Memahami middleware ini bukan hanya tentang bagaimana menggunakannya, tetapi juga mengapa mereka penting dan bagaimana mengintegrasikannya secara efektif ke dalam alur kerja pengembangan Anda. Dengan menguasai penggunaan middleware yang tepat, Anda akan mampu membangun aplikasi web yang lebih robust, dapat di-maintain, dan siap produksi.
TAGS: Express.js, Middleware, Node.js, Web Development, Backend, API, Coding, Developer Tools, JavaScript, Server

