私はexpress.jsのソースコードを見て、名前付きルートパラメーターをreq.params
プロパティにマップする方法を調べていました。
知らない人のために、express.jsで、名前付きパラメーターを使用してルートを定義し、それらをオプションにし、特定の形式(およびそれ以上)のルートのみを許可することができます。
app.get("/user/:id/:name?/:age(\\d+)", function (req, res) {
console.log("ID is", req.params.id);
console.log("Name is", req.params.name || "not specified!");
console.log("Age is", req.params.age);
});
この機能の中心は、 lib/utils.jspathRegexp()
で定義されていると呼ばれるメソッドであることに気づきました。メソッドの定義は次のとおりです。
function pathRegexp(path, keys, sensitive, strict) {
if (path instanceof RegExp) return path;
if (Array.isArray(path)) path = '(' + path.join('|') + ')';
path = path
.concat(strict ? '' : '/?')
.replace(/\/\(/g, '(?:/')
.replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g, function (_, slash, format, key, capture, optional, star) {
keys.push({ name: key, optional: !! optional });
slash = slash || '';
return ''
+ (optional ? '' : slash)
+ '(?:'
+ (optional ? slash : '')
+ (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')'
+ (optional || '')
+ (star ? '(/*)?' : '');
})
.replace(/([\/.])/g, '\\$1')
.replace(/\*/g, '(.*)');
return new RegExp('^' + path + '$', sensitive ? '' : 'i');
}
重要な部分は7行目の正規表現で/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g
、パス名の一致する部分を次のようにグループ化します。
slash
the /
symbol
format I don't know what is the purpose of this one, explanation needed.
key
the word (ie. \w+
) after the :
symbol
capture
a regex written in front of the key
. Should be wrapped in parenthesis (ex. (.\\d+)
)
optional
the ?
symbol after the key
star
the *
symbol
コールバックハンドラーは、上記のグループから正規表現を作成します。
さて、問題は、ここでの目的は何format
ですか?
次の行による私の理解:
(format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)'))
言及された正規表現は、
.
グループの後にシンボルを配置しslash
、一致条件(の後に括弧で囲まれた正規表現)を指定しない場合、生成された正規表現は、またはシンボルに到達するまでkey
残りの部分と一致します。path
.
/
それで、ポイントは何ですか?
私はこれを求めています、なぜなら:
- このメソッドを抽出してアプリで使用し、使用する前にどのように機能するかを完全に理解したいと思います。
- express.jsのドキュメントには何も見つかりませんでした。
- 私はただ興味があります:)