BelajarDev merupakan bagian dari eksperimen Muhammad Ikhsan di Smartech Studios.
Express.js Wildcard Route — TypeError: The "*" modifier must follow a named parameter
Kendala
Setelah deploy digital garden baru (https://mikhsan.id) ke server dan install Express.js (dengan manual npm install), mendapati error:
Run `npm audit` for details./app/node_modules/path-to-regexp/dist/index.js:108 throw new PathError(`Missing parameter name at index ${index}`, str); ^PathError [TypeError]: Missing parameter name at index 1: *; visit https://git.new/pathToRegexpError for info at consumeUntil (/app/node_modules/path-to-regexp/dist/index.js:108:27) at parse (/app/node_modules/path-to-regexp/dist/index.js:140:26) at process (/app/node_modules/path-to-regexp/dist/index.js:263:56) at pathToRegexp (/app/node_modules/path-to-regexp/dist/index.js:274:5) at Object.match (/app/node_modules/path-to-regexp/dist/index.js:225:30) at matcher (/app/node_modules/router/lib/layer.js:86:23) at new Layer (/app/node_modules/router/lib/layer.js:93:62) at Function.route (/app/node_modules/router/index.js:428:17) at Function.route (/app/node_modules/express/lib/application.js:257:22) at app.<computed> [as get] (/app/node_modules/express/lib/application.js:478:22) { originalPath: '*'}Node.js v18.20.5
Tanpa sepengetahuan saya bahwa Express.js yang diinstall adalah versi 5, berbeda dari versi yang dipakai di digital garden ini (masih v4).
Di Express v4, Anda bisa menggunakan asterisk tunggal * sebagai catch-all. Di Express v5, semua wildcard wajib memiliki nama. Tanpa nama, parser akan menganggapnya sebagai parameter yang tidak valid dan melempar PathError.
Cara Memperbaikinya
Solusi: cari semua route yang menggunakan *, kemudian ubah dengan memberikan nama parameter (misal: *splat atau *path).
1. Rute Catch-all (Global)
-
Lama (Express 4):
app.get('*', (req, res) => { ... }); -
Baru (Express 5): Gunakan format penamaan parameter:
app.get('/*splat', (req, res) => { ... }); // Atau untuk mencakup root path juga: app.get('/{*splat}', (req, res) => { ... });
2. Wildcard Parsial
-
Lama (Express 4):
app.use('/api*', (req, res) => { ... }); -
Baru (Express 5):
app.use('/api{*path}', (req, res) => { ... });
3. Alternatif: Menggunakan RegEx
Kalau nggak mau pakai penamaan, gunakan literal Regular Expression:
app.get(/.*/, (req, res) => { ... });
Express v5 menggunakan path-to-regexp v8.0+. Library ini sekarang memperlakukan asterisk * mirip dengan parameter bernama (seperti :id).
Menurunkan versi Express kembali ke v4 dengan perintah: npm install express@4