[英]express.js routes explanation
我正在查看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.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 .
或/
符號。
那有什么意義呢?
我問這個,因為:
它適用於匹配文件擴展名等。
給定路徑'/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.