Node.js 我如何允许在快车路线中使用斜线?

Node.js 我如何允许在快车路线中使用斜线?,node.js,express,Node.js,Express,我正在尝试实现permalinks,格式为带连字符的/2013/02/16/title。我想使用路线参数。如果我尝试以下路线: app.get('/:href', function(req, res) { }); …然后我得到一个404,大概是因为Express只寻找一个参数,并且认为有4个 我可以用/:y/:m/:d/:t来解决这个问题,但这会迫使我的永久链接永久保持这种形式 如何获取包含斜杠的路由参数?使用正则表达式而不是字符串 app.get(/^\/(.+)/, function(re

我正在尝试实现permalinks,格式为带连字符的
/2013/02/16/title
。我想使用路线参数。如果我尝试以下路线:

app.get('/:href', function(req, res) { });
…然后我得到一个404,大概是因为Express只寻找一个参数,并且认为有4个

我可以用
/:y/:m/:d/:t
来解决这个问题,但这会迫使我的永久链接永久保持这种形式


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

使用正则表达式而不是字符串

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

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

例如:

app.get('/:compa([0-9])/:compb([a-z]/')
仅当第一个组件(compa)是一个数字,而第二个组件(compb)是一个字母a-z时,此路由才匹配

“/:href(+)”
说“仅当内容是任何内容时才匹配第一个组件”,这没有多大意义;无论如何,这是默认行为。此外,如果您检查,您将看到Express实际上强制该条件中的点为literal

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

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

请注意,您的
已转义,因此此路由将只匹配一个或多个句点。

您可以使用regex路由来执行此操作

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']
似乎
app.get(“/:href(*)”,…)
工作正常(至少在Express 4中)。您将在
req.params.href
中获得参数值


它还将由
/
路由触发,这可能不是您想要的。您可以通过在应用程序的其他位置设置
app.get(“/”,…)
或显式检查空字符串来避免此问题。

如果参数中包含斜杠,则可以使用此选项

app.get('/:href(*)', function(req, res) { ... })
它对我有用。在我的例子中,我使用了像ABC1/12345/6789(10)这样的参数

希望这有用。

我正在尝试
app.get('/:href(+)“,…
运气不好。我缺少什么?我不认为你可以在路由字符串中传递regexp。你必须传递regexp对象;请参阅。我正在执行上面提到的stackoverflow应答。我无法让第一个开始工作,但我用正确的regex编辑了它并开始工作example@RogerLipscombe当前位置那篇文章是关于限制pa的内容路由的特定组件匹配;您不能使用该语法插入任意正则表达式。我已经用更多的细节扩展了我的答案,说明了原因。我本来打算接受/*的,但您成功了