一般に、URLの任意の部分は、URL位置によって識別されるのではなく名前付きパラメータであるため、どの文字列が存在するのかを自己識別するため、クエリ文字列の方がずっとうまく機能します。
ExpressルートマッチングのURLパスセグメントは特定の順序であり、渡されたものに対して決定的ではないため、オプションのパラメータが必要なシーケンスは使用できません。エクスプレス・ルート・マッチング・アルゴリズム自体は、あなたが望むほど柔軟ではなく、パワフルではありません。
あなたは、いくつかのオプションがあります。
はルート定義のうち:exact_phrase
と:exclude_words
を残し、その後、ちょうどあなた自身のURLがあります正確に何を見るためにルートハンドラで解析します。この方法で、任意のフォーマットに調整することができます。
URL内のパスセグメントではなく、異なる順序またはオプションのクエリパラメータとしてすべてのパラメータを入れてから、req.query
を使用してURLに存在するものを正確に表示します。クエリパラメータは任意で、任意の順序で指定できます。
この最後のオプションは次のようになります:
FYI
// url: /api/advancedSearch/123/4?exact_phrase=foo&exclude_words=cat,dog
app.get('/api/advancedSearch/:id/:page_no/', function(req,res) {
var excludeWords = [];
if (req.query.exclude_words) {
excludeWords = req.query.exclude_words.split(",");
}
var exactPhrase = req.query.exact_phrase || "";
// do the rest of your processing here
});
、それはオプションの引数がのqueryStringではなく、コアのURLパスでなければならないことを概念的に理にかなっています。クエリ文字列パラメータは自己識別であるため、存在するものと存在しないものとのあいまいさが大幅に少なくなります。 URLにオプションのパスセグメントがある場合は、どのパスセグメントが存在し、どのような意味があるのかを特定するための何らかのシステムを発明する必要があります。これは完全なアプリケーションとコンテキスト固有のものなので、Expressはそれを自動的に行うことはできません。
'req.params'の代わりに[' req.query'](http://expressjs.com/en/4x/api.html#req.query)を使う方が良いようです。 – cdbajorin