我试图理解express.js的内部管道,但我在一件事上遇到了一些麻烦。
如果添加新路线,请执行以下操作:
app.get("/hello/darkness/myold/:name", ...)
我在内部提供的字符串成为正则表达式。现在,我想出了我认为正则表达式应该是内部的,我想出了:
^\/hello\/darkness\/myold\/([^\/]+?)\/?$
([^\/]+?)
将捕获name
参数,如果禁用严格路由,则会出现\/?
,并且整个事件都封装在^...$
中。然而,当我去看看实际存储在express中的内容时,实际上是这样的:
^\/hello\/darkness\/myold\/(?:([^\/]+?))\/?$
如您所见,捕获组周围有一个非捕获组。我的问题是:这个非捕获组的目的是什么?
我用来查看regex express.js内部使用的方法只是制作一个无效的正则表达式并查看错误控制台:
app.get('/hello/darkness/myold/:friend/[', function(req, res){});
产量
SyntaxError: Invalid regular expression: ^\/hello\/darkness\/myold\/(?:([^\/]+?))\/[\/?$
答案 0 :(得分:0)
这个问题的答案是非捕获组是参数是可选的情况的遗留物。考虑以下两条路线之间的区别:
/hello/:world/goodbye
/hello/:world?/goodbye
他们将分别生成:
^\/hello\/(?:([^\/]+?))\/goodbye\/?$
^\/hello(?:\/([^\/]+?))?\/goodbye\/?$
请注意,当存在可选参数时,非捕获组会发生重要但微妙的更改。