我如何在我的快速路线允许斜杠?

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

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

…然后我得到一个404,大概是因为快递只是在寻找一个参数,并认为有4个。

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

我如何获得路线参数,包括斜线?

使用正则expression式而不是string。

 app.get(/^\/(.+)/, function(req, res) { var href = req.params[0]; // regexp's numbered capture group }); 

请注意,不能使用string语法( app.get('/:href(.+)') ),因为Express只允许在路由string中使用正则expression式的一小部分,并且使用这些正则expression式作为条件检查路线的特定组成部分 。 它不捕获条件中的匹配内容,也不允许您在组件之间进行匹配(用斜杠分隔的URL部分)。

例如:

 app.get('/:compa([0-9])/:compb([az]/') 

如果第一个组件( compa )是单个数字,而第二个组件( compb )是单个字母az,则此路线只匹配。

'/:href(.+)'表示“仅当内容是任何东西时匹配第一个组件”,这没有多大意义; 这是默认行为。 此外,如果您查看源代码 ,则会看到Express实际上是强制该条件中的点是文字。

例如, app.get('/:href(.+)')实际编译成:

  /^\/(?:(\.+))\/?$/i 

注意你的. 被逃脱了,所以这条路线只能匹配一个或多个时段。

看起来app.get("/:href(*)", ...)工作正常(至less在Express 4中)。 您将在req.params.href获得您的参数值。

它也会被/路由,这可能不是你想要的。 您可以通过在应用程序中的其他位置设置app.get('/', ...)或显式检查一个空string来避免它。

你可以用正则expression式来做到这一点

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

我不知道这个正则expression式是否正确,但是你明白了

编辑:

我不认为上述的工作,但是这样做

 app.get(/^\/(\d+)\/(\d+)\/(\d+)\/(.*)/, function(req, res) { }); 

http://localhost:3000/2012/08/05/hello-i-must-be 3000/2012/08/05 http://localhost:3000/2012/08/05/hello-i-must-be yeilds req.params = [ '2012', '08', '05', 'hello-i-must-be' ]