我正在尝试以/2013/02/16/title-with-hyphens
的形式实现永久链接。我想使用路由参数。如果我尝试以下路线:
app.get('/:href', function(req, res) { });
...然后我得到了404,大概是因为Express只查找一个参数,并且认为有4个。
我可以使用/:y/:m/:d/:t
解决这个问题,但这会迫使我的永久链接永久保留。
如何获取包含斜杠的路由参数?
答案 0 :(得分:29)
似乎app.get("/:href(*)", ...)
工作正常(至少在Express 4中)。您将获得req.params.href
中的参数值。
它也会被/
路由触发,这可能不是你想要的。您可以通过在应用中的其他位置设置app.get('/', ...)
或明确检查空字符串来避免它。
答案 1 :(得分:28)
使用正则表达式而不是字符串。
app.get(/^\/(.+)/, function(req, res) {
var href = req.params[0]; // regexp's numbered capture group
});
请注意,您不能使用字符串语法(app.get('/:href(.+)')
),因为Express仅允许路由字符串中的一小部分正则表达式,并且它使用这些正则表达式作为特定组件的条件检查< / em>的路线。它不捕获条件中的匹配内容,也不允许您跨组件匹配(URL的部分由斜杠分隔)。
例如:
app.get('/:compa([0-9])/:compb([a-z]/')
此路线仅在第一个组件( compa )为单个数字时匹配,而第二个组件( compb )为单个字母a-z。
'/:href(.+)'
表示&#34;只有当内容是任何内容时才匹配第一个组件&#34;,这没有多大意义;无论如何,这是默认行为。此外,如果您检查the source,您会发现Express实际上强制该条件中的点为字面值。
例如,app.get('/:href(.+)')
实际编译成:
/^\/(?:(\.+))\/?$/i
请注意,您的.
已转义,因此此路线只会匹配一个或多个期间。
答案 2 :(得分:1)
您可以使用正则表达式路由
执行此操作app.get('/:href(\d+\/\d+\/\d+\/*)', function(req, res) { });
我不知道正则表达式是否正确,但你明白了
编辑:
我不认为上述情况有效,但确实如此
app.get(/^\/(\d+)\/(\d+)\/(\d+)\/(.*)/, function(req, res) { });
转到http://localhost:3000/2012/08/05/hello-i-must-be
yeilds req.params = [ '2012', '08', '05', 'hello-i-must-be' ]
答案 3 :(得分:0)
如果您的参数包含斜杠,您可以使用它
app.get('/:href(*)', function(req, res) { ... })
它对我有用。就我而言,我使用了 ABC1/12345/6789(10)
之类的参数。
希望这有用。