【问题标题】:Multiple optional route and 2 handlers on NodeJs applicationNodeJs 应用程序上的多个可选路由和 2 个处理程序
【发布时间】:2018-07-20 12:07:58
【问题描述】:

这是一个带有 2 个处理程序的渐进式路由。

app.get('/blog/:year/:quarter/:month?/:day?/:post', routes.views.post);
app.get('/blog/:year/:quarter/:month?/:day?/', routes.views.post_listing);

这里的“月”和“日”是可选的。当没有 post 参数时,路由应该回退到 'post_listing' 处理程序。

非常感谢任何帮助。 提前致谢!

【问题讨论】:

  • 你应该把:post放在你的第一条路由的开头,像这样:app.get('/blog/:post/:year/:quarter/:month?/:day?, routes.views.post);。这对您来说是可以接受的,还是像您在示例中展示的那样?
  • @NEXTLEVELSHIT 对不起,我的朋友,那没用。当您使用此方法获得所有 5 个参数时,页面将重定向到 404。在这里,'post' 和 'post_listing' 处理程序命中不同的模型。
  • 将条件参数 (month, day) 放在强制参数 (year, post, quarter) 之间可能会导致对所提供参数的误解。如果你想同时使用你的两个路由,你会遇到一些极端情况,其中post 参数可以理解为monthday。你明白我的意思了吗?

标签: node.js express routing routes keystonejs


【解决方案1】:

问题说明

如果您想使用示例中所示的路线,则必须使用正则表达式指定您的路线。保持原样,您的路线将向您指定的两个路线处理程序确认 /blog/1984/1/my-post/ 之类的路线。

您必须像在这些示例中那样指定它们:http://expressjs.com/en/guide/routing.html#route-paths

解决方案

在那里,您将声明 year 为 4 位参数,quarter 为一位,month 为两位,day 为两位,post 为带有破折号的字母数字组合(这很常见slug):

app.get('/blog/:year(\d{4})/:quarter(\d{1})/:month(\d{2})?/:day(\d{2})?/:post([a-z0-9-]+$)', routes.views.post);
app.get('/blog/:year(\d{4})/:quarter(\d{1})/:month(\d{2})?/:day(\d{2})?/', routes.views.post_listing);

帮助自己的更多建议

还有一个很棒的工具可以用来测试和玩快速路线:http://forbeslindesay.github.io/express-route-tester/

【讨论】:

  • 好吧,如果参数是数字的话,那会起作用。但是,就我而言,它是字符,我有另一条与上述参数相同的路线。谢谢!并感谢您的反馈。
  • 告诉我它们的外观,我会调整它。
  • 假设我们有如下路线: app.get('/hospitals/:region/:country/:state?/:city?/:hospital', function(req, res, next ){ /**/ });在上述路线中 - 少数国家可能没有州或城市,并且视图与以下路线不同。 app.get('/hospitals/:region?/:country?/:state?/:city?/', function(req, res, next){ /**/ });在第二条路线中 - 我们想显示基于城市||州||国家||的医院列表地区。你明白我的意思了吗?提前致谢。
  • 可选参数是否仅用于 SEO 目的?
  • 如果您想按地区、国家、州和城市进行过滤,则不应将这些参数声明为可选。如果您不进入任何地区或国家,而是进入州和城市,会发生什么?您将无法将州和城市参数与国家和地区区分开来。它们将被解释为地区和国家。
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多