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

Rog*_*mbe 25 node.js express

我试图在表单中实现永久链接/2013/02/16/title-with-hyphens.我想使用路由参数.如果我尝试以下路线:

app.get('/:href', function(req, res) { });
Run Code Online (Sandbox Code Playgroud)

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

我可以解决这个问题/:y/:m/:d/:t,但这会迫使我的固定链永久地成为这种形式.

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

Tad*_*spy 30

似乎app.get("/:href(*)", ...)工作正常(至少在Express 4中).您将获得参数值req.params.href.

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


jos*_*736 29

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

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

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

例如:

app.get('/:compa([0-9])/:compb([a-z]/')
Run Code Online (Sandbox Code Playgroud)

如果第一个组件(compa)是单个数字,并且第二个组件(compb)是单个字母az ,则此路由仅匹配.

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

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

 /^\/(?:(\.+))\/?$/i
Run Code Online (Sandbox Code Playgroud)

请注意,您.已被转义,因此此路线仅匹配一个或多个期间.