簡體   English   中英

express.js路線說明

[英]express.js routes explanation

我正在查看源代碼,以了解它如何將命名的路由參數映射到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.js中定義的一個名為pathRegexp()的方法。 方法定義如下:

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 ( /(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?(\\*)?/g/(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?(\\*)?/g/(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?(\\*)?/g以這種方式對路徑名的匹配部分進行分組:

削減 /符號

格式 我不知道這個的目的是什么,需要解釋。

字(即\\w+后) :符號

捕獲 key前面寫的正則表達式。 應該用括號括起來(例如(.\\\\d+)

可選 ? key后的符號

明星 *符號

並且回調處理程序從上面的組構建一個正則表達式。


現在的問題是format的目的什么?

我的理解如下:

(format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)'))

和前面提到的正則表達式是,

如果你放一個. slash組之后的符號並且沒有指定匹配條件(正則表達式包含在key后的括號中),生成的正則表達式匹配path的其余部分,直到它到達a . /符號。

那有什么意義呢?


我問這個,因為:

  1. 我想在我的應用程序中提取和使用此方法,並希望在使用它之前完全理解它的工作原理。
  2. 我沒有在express.js上找到任何關於它的文檔。
  3. 我只是好奇 :)

它適用於匹配文件擴展名等。

給定路徑'/path/:file.:ext' ,考慮表達式之間的差異:

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

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

在第一種情況下,你最終得到了params

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

但沒有格式檢查,你最終得到這個:

{
    file: 'f',
    ext: 'ile.js'
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM