【问题标题】:What does ":op?" mean in a url route?":op" 是什么意思?是指在 url 路由中?
【发布时间】:2014-07-01 16:20:30
【问题描述】:

查看一些 Node.js Express 代码,我看到了这个路由列表:

app.all('/user/:id/:op?', user.load);
app.get('/user/:id', user.view);
app.get('/user/:id/view', user.view);
app.get('/user/:id/edit', user.edit);
app.put('/user/:id/edit', user.update);

运行此程序时,我注意到对/user/:id 的请求实际上被路由到user.load。作为新手,我很惊讶。

:op? 在第一行做了什么导致它捕捉到一条不太具体的路线?我在Express documentation 中找不到:op? 的任何实例。

【问题讨论】:

  • 它是一个变量,它可以是任何东西
  • 当url为/user/120/hello时,op将为hello

标签: javascript express url-routing


【解决方案1】:

来自app.all的文档:

此方法对于映射“全局”逻辑非常有用 特定路径前缀或任意匹配。

现在让我们看看路由。

app.all('/user/:id/:op?', user.load)中的问号?表示路由中的参数:op(可以认为是“操作”)是可选的。

由于all 方法调用位于其他路由调用之前,因此与/user/:id//user/:id/view/user/:id/edit 路由匹配的所有内容都将首先通过user.load 方法。值得一提的是,:op 作为参数很可能在user.load 中没有任何特定作用,而是在路由中充当占位符。

这种方法很可能有助于在继续进行viewedit 操作之前检查实体是否存在于数据库中。

另外,请记住 @apsillers comment 和文档中的引用引用,user.load 方法可能在回调结束时调用 next(),以便继续进行其他路由匹配。

【讨论】:

  • 来自app.all 文档后面的几句话(如果 OP 不熟悉 Express,这可能有助于进一步澄清您的答案):“请记住,这些回调不必采取行动作为端点,loadUser 可以执行任务,然后next() 继续匹配后续路由。”因此,单个 HTTP 请求可以立即触发 both 来自 app.alluser.load 另一个更具体的匹配项。您的答案中已经存在这样的策略;我只是想明确地说出来。
  • @apsillers 谢谢!我在答案中提到这一点是对的,所以你的评论是完全有效的,而且及时。
【解决方案2】:

我完全不知道这段代码是什么,或者它做了什么。

但我猜想,就像 :id 用于放置用户的 ID 一样,:op? 将用于可选地 (?) 放置一个 操作操作(例如正如我们在下面看到的viewedit

【讨论】:

  • 你玩过 Express 吗?
  • @VisioN 不。从来没有听说过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2022-01-28
  • 1970-01-01
  • 2011-08-25
  • 2021-08-10
相关资源
最近更新 更多