Saya mencoba untuk memiliki satu rute yang mencakup semuanya /foo
termasuk /foo
dirinya sendiri. Saya sudah mencoba menggunakan /foo*
yang berfungsi untuk semuanya kecuali tidak cocok /foo
. Mengamati:
var express = require("express"),
app = express.createServer();
app.get("/foo*", function(req, res, next){
res.write("Foo*\n");
next();
});
app.get("/foo", function(req, res){
res.end("Foo\n");
});
app.get("/foo/bar", function(req, res){
res.end("Foo Bar\n");
});
app.listen(3000);
Keluaran:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
Apa saja pilihan saya? Yang terbaik yang pernah saya temukan adalah rute /fo*
yang tentu saja tidak terlalu optimal karena akan terlalu cocok.
/foo*
rute seperti itu, tidakkah Anda ingin menjadikannya middleware?/foo*
kecocokan/foo/bar
tetapi juga kecocokan/foolish
yang mungkin tidak Anda inginkan.Jawaban:
Saya pikir Anda harus memiliki 2 rute. Jika Anda melihat baris 331 dari koneksi router, * di jalur diganti dengan. + Jadi akan cocok dengan 1 atau lebih karakter.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Jika Anda memiliki 2 rute yang melakukan tindakan yang sama, Anda dapat melakukan hal berikut agar tetap KERING .
sumber
app.get(["/foo", "/foo*"], /* function */);
mungkin preferensial juga!Router penghubung sekarang telah dihapus ( https://github.com/senchalabs/connect/issues/262 ), penulis menyatakan bahwa Anda harus menggunakan kerangka kerja di atas koneksi (seperti Express) untuk perutean.
Express saat ini diperlakukan
app.get("/foo*")
sebagaiapp.get(/\/foo(.*)/)
, menghilangkan kebutuhan untuk dua rute terpisah. Ini berbeda dengan jawaban sebelumnya (mengacu pada koneksi router yang sekarang dihapus) yang menyatakan bahwa "*
dalam jalur diganti dengan.+
".Update: Express saat ini menggunakan "jalan-to-regexp" modul (karena Ekspres 4.0.0) yang mempertahankan perilaku yang sama dalam versi saat ini direferensikan. Tidak jelas bagi saya apakah versi terbaru modul itu mempertahankan perilakunya, tetapi untuk saat ini jawaban ini berlaku.
sumber
/\/foo(.+)/
jika Anda ingin mencocokkan/foo
diikuti dengan satu atau lebih karakter, dan/foo*
atau/\/foo(.*)/
jika Anda ingin mencocokkan/foo
diikuti dengan nol atau lebih karakter.Berikut adalah contoh yang berfungsi sepenuhnya, silakan salin dan tempel ini ke dalam file .js untuk dijalankan dengan node, dan mainkan di browser (atau curl):
sumber
Dalam array Anda juga dapat menggunakan variabel yang meneruskan ke req.params:
sumber
Bagi mereka yang sedang mempelajari node / express (seperti saya): jangan gunakan perutean wildcard jika memungkinkan!
Saya juga ingin menerapkan perutean untuk GET / users /: id / apa pun yang menggunakan perutean wildcard. Beginilah cara saya sampai di sini.
Info lebih lanjut: https://blog.praveen.science/wildcard-routing-is-an-anti-pattern/
sumber