我如何在我的快速路线允许斜杠?
我试图以/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' ]