これを完全に理解するには、ドキュメントをお読みください: http://expressjs.com/api.html #router.METHOD
エクスプレスルートがパスをキャプチャする方法
:param
を使用する場合 パスの一部として、/*
などのすべてに一致します 、キャプチャされた値はreq.params.param
に保存されます 。
複数のルールがある場合、最初に登録されたルールが最初にチェックされます。一致するものが見つかるまで、各ルールに対して各呼び出しをチェックします。 next()
を呼び出す場合 値が渡されない場合、次の一致を検索します(同じルートで、または次のミドルウェアに進みます)。
したがって、これら3つのルールはすべて実行されます
var handleRoute = function(req, res, next){
console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
next();
}
route.route('/user/:id').get(handleRoute);
route.route('/user/:user').get(handleRoute);
route.route('/user/*').get(handleRoute);
/user/foobar
をリクエストすると 、次の出力が表示されます(おそらく、応答しなかったため、クライアントとしてエラーが発生します:P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
3つすべてにヒットしますが、コンテキストはそれぞれ異なります。
正規表現を使用してパスパターンをキャプチャする方法
id(たとえばすべての数字)とユーザー名(すべての文字)の別々のルートをキャプチャする場合は、次のように実行できます。
var handleRoute = function(tag) {
return function(req, res, next) {
console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
res.status(200)
.json({
success: 'yay!'
});
};
};
route.route(/^\/user\/([0-9]+)$/i)
.get(handleRoute('id'));
route.route(/^\user\/([A-Za-z]+)$/i)
.get(handleRoute('user'));
route.route('/user/*')
.get(handleRoute('catch all'));
私のキャプチャグループの周りのパラセシスに注意してください。これがないと、params
空です。 *
だけで自動キャプチャします 彼らはいい人だからです。 3つの異なるタイプに対して実行すると、次の出力が得られます。
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
それがすべてを説明しているので、あなたはバグがあなたのシステムに蔓延するためのいくつかのベクトルに自分自身を開いています。あなたのURLパターンについて考えたいかもしれません。