29

我正在尝试以/2013/02/16/title-with-hyphens. 我想使用路由参数。如果我尝试以下路线:

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

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

我可以使用 来解决它/:y/:m/:d/:t,但这会迫使我的永久链接永久采用这种形式。

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

4

4 回答 4

35

似乎app.get("/:href(*)", ...)工作正常(至少在 Express 4 中)。你会得到你的参数值req.params.href

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

于 2014-06-23T12:32:37.027 回答
33

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

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

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

例如:

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

此路由仅在第一个组件 ( compa ) 是单个数字且第二个组件 ( compb ) 是单个字母 az时匹配。

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

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

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

请注意,您.已转义,因此此路线将仅匹配一个或多个句点。

于 2013-02-16T22:03:01.473 回答
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收获req.params = [ '2012', '08', '05', 'hello-i-must-be' ]

于 2013-02-16T22:03:57.060 回答
0

如果您的参数中包含斜杠,您可以使用它

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

这个对我有用。就我而言,我使用了诸如ABC1/12345/6789(10).
希望这有用。

于 2021-04-14T06:02:25.320 回答