9

私はのソースコードを見て、名前付きルートパラメーターを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./

それで、ポイントは何ですか?


私はこれを求めています、なぜなら:

  1. このメソッドを抽出してアプリで使用し、使用する前にどのように機能するかを完全に理解したいと思います。
  2. express.jsのドキュメントには何も見つかりませんでした。
  3. 私はただ興味があります:)
4

1 に答える 1

5

ファイル拡張子などを適切に一致させるためのものです。

パスが与えられたら、'/path/:file.:ext'式の違いを考慮してください。

// With 'format' checking
/^\/path\/(?:([^\/]+?))(?:\.([^\/\.]+?))\/?$/

// Without 'format' checking
/^\/path\/(?:([^\/]+?))(?:([^\/]+?))\/?$/

最初のケースでは、パラメータは次のようになります。

{
    file: 'file',
    ext: 'js'
}

しかし、フォーマットチェックを行わないと、次のようになります。

{
    file: 'f',
    ext: 'ile.js'
}
于 2013-03-10T01:22:47.927 に答える