【问题标题】:How can I create an Express route that handles URLs that look like this?如何创建一个处理类似这样的 URL 的 Express 路由?
【发布时间】:2016-06-24 19:25:29
【问题描述】:
app.get('/:service[SOMETHING GOES HERE]', function(req, res, next){
    console.log('Service is:', req.params.service);
});

这需要捕获看起来像以下任何一种的 URL:

/foo
/foo/bar
/foo/bar/baz

回调与 foo 之后的任何内容无关,但理想情况下应该能够将 foo 作为名为 service 的参数访问,而无需手动解析路径。

我一直在使用this 进行测试,但仍然没有找到任何可以做到这一点的东西。到目前为止最接近的是/:service*。

编辑:不,它不是答案为 /:service/* 的那个的副本,因为它不包括 /foo。

【问题讨论】:

  • 您不能这样做,因为:service 是一个变量,并没有指明它在 URL 模式中的开始或停止位置。因此,您没有提供任何规则来知道 URL 的哪个部分将被解释为 :service 部分以及后面的部分。因此,您似乎要求的是一条匹配所有内容的路由,然后您在匹配所有内容后从 URL 中解析出片段。如果这不是你要问的意思,那么请澄清你的问题。请说明你应该匹配什么和你不应该匹配这条路线。
  • 为了表明它从哪里开始和停止,express 在内部做了一些正则表达式来匹配斜线之间的东西。我只是想知道是否有一种更简单的方法可以涵盖所有情况。例如。 /:service/:trash* 涵盖案例 2 和 3,但不涵盖案例 1,/:service 涵盖案例 1,但不涵盖案例 2 和 3。
  • 不,它不是答案为 /:service/* 的那个的副本,因为这不包括 /foo。
  • @Paraknight 不在 Express 中(不要太相信测试人员 ;-)

标签: regex node.js express url-routing


【解决方案1】:

在实际的 Express 路线中使用 /:service* 完全符合您的要求:

/foo           maps to { '0': '', service: 'foo' }
/foo/bar       maps to { '0': '/bar', service: 'foo' }
/foo/bar/blah  maps to { '0': '/bar/blah', service: 'foo' }

Express Route Tester 出于某种原因,针对这些类型的模式以不同方式映射这些 URL(它的配置可能与 Express 不同)。

【讨论】:

    【解决方案2】:

    您可以为此使用app.use() 函数。阅读有关路径处理的文档以获取更多信息。您的代码修改后将是:

    app.use('/foo', function(req, res, next){
        console.log('Service is:', req.params.service);
    });
    

    缺点是您不会将foo 恢复为服务参数。

    【讨论】:

    • 也许我并不清楚——“foo”可以是任何东西;我不想为每个案例都做 app.use,只是一个包罗万象。
    • 那么如果“foo”可以是任何东西,那么路径可以是任何东西,app.use('/', fun...) 将满足您的目的。你仍然没有得到服务属性。请求属性旨在存储 expressjs 文档中定义的路径变量。任意路径不是变量。
    • 这不是任意路径,它只是路径的第一部分。第二个和第三个应该是可选的 - 对于这个处理程序,我不关心它们。
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2011-09-11
    • 2013-02-18
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多