如何在Express路线中允许斜线?

时间:2013-02-16 21:48:37

标签: node.js express

我正在尝试以/2013/02/16/title-with-hyphens的形式实现永久链接。我想使用路由参数。如果我尝试以下路线:

app.get('/:href', function(req, res) { });

...然后我得到了404,大概是因为Express只查找一个参数,并且认为有4个。

我可以使用/:y/:m/:d/:t解决这个问题,但这会迫使我的永久链接永久保留。

如何获取包含斜杠的路由参数?

4 个答案:

答案 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) 之类的参数。
希望这有用。