gpt4 book ai didi

node.js - 如何在快速路由中指定可选参数名称?

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:17 25 4
gpt4 key购买 nike

下面是我的路线代码:-

app.get('/server/lead/get/:id?', leadCtrl.get);
app.get('/server/lead/filter/:filterQuery', leadCtrl.get);

正如您在上面看到的,我使用不同的路线来访问相同的 Controller 方法leadCtrl.get

现在,我想要类似路由 app.get('/server/lead/get/:id?:filter?', LeadCtrl.get); 的东西。因此,我可以获取 req.params.idreq.params.filter 参数,但一次只能获取一个。

最佳答案

您在问题中提出的问题不可能以您所描述的形式出现。

Now, i want something like route app.get('/server/lead/get/:id?:filter?', leadCtrl.get);. So, i can get params either req.params.id or req.params.filter but only one at a time.

您的路由器无法区分这两个参数。如果它收到对 /server/lead/get/X 的请求,那么 X 是什么?过滤器还是 ID?

你的选择

您这里几乎没有解决方案:

  1. 您可以像以前一样继续使用两条路线。

  2. 您可以对这两种情况使用通用参数,正如 Robert 在评论中所解释的那样。

  3. 或者,您可以使用在我看来最适合您的用例的解决方案 - 命名查询参数 - 只需使用路由 /server/lead/get 并使用查询参数来传递 id和过滤器。

示例网址:

  • /server/lead/get?id=xxx
  • /server/lead/get?filterQuery=xxx

您只需确保在处理程序中一次仅设置这两者之一,如下所示:

if (req.query.id && req.query.filterQuery) {
// respond with error
}

如果您有 app.get('/server/lead/get/:id?') 路由,您甚至可以混合使用两者,您可以将 id 包含在路由中,并将 filterQuery 作为查询范围。现在 URL 将是:

  • /server/lead/get/xxx(用于 ID)
  • /server/lead/get?filterQuery=xxx(用于过滤器)

有关更多信息,请参阅:http://expressjs.com/en/api.html#req.query

更好的方法

如果您遵循一些REST 约定,那么您可以使用:

  • app.get('/server/lead/:id') 用于一个具有 id 的对象(可选)
  • app.get('/server/lead') 获取对象列表(可选的filterQuery作为查询参数传递)

这样,当您访问时,您将始终知道:

  • /server/lead/xxx - 那么它就是 ID = xxx 的一个对象
  • /server/lead - 那么它是任何对象的列表
  • /server/lead?filterQuery=xxx - 那么它是与查询匹配的对象的列表

如果您遵循此类的 REST 约定,而不是发明自己的约定,那么您设计路由和处理程序会更容易,并且其他人使用您的系统也会更容易。

您可能还想使用复数 /server/leads 而不是 REST 中常见的 /server/lead。这样,leads 是一个列表,leads/id 是其元素之一,这一点会更加明显。

更多信息请参见:

关于node.js - 如何在快速路由中指定可选参数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40742959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com