如何在快递路线中制作可选参数名称?

vin*_*eet 1 routes node.js express

以下是我的路线代码:-

app.get('/server/lead/get/:id?', leadCtrl.get);
app.get('/server/lead/filter/:filterQuery', leadCtrl.get);
Run Code Online (Sandbox Code Playgroud)

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

现在,我想要类似 route 的东西app.get('/server/lead/get/:id?:filter?', leadCtrl.get);。所以,我可以得到参数,req.params.id或者req.params.filter一次只能得到一个。

rsp*_*rsp 5

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

现在,我想要类似 route app.get('/server/lead/get/:id?:filter?',leadCtrl.get); 的东西。所以,我可以得到参数 req.params.id 或 req.params.filter 但一次只能得到一个。

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

您的选择

您在这里有几个解决方案:

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

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

  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
}
Run Code Online (Sandbox Code Playgroud)

如果您有app.get('/server/lead/get/:id?')路线,您甚至可以将两者混合使用,您可以将路线中的 id 和 filterQuery 作为查询参数。现在 URL 将是:

  • /server/lead/get/xxx (身份证)
  • /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而不是/server/leadREST 中常见的复数形式。这样,它leads是一个列表并且leads/id是它的元素之一将更加明显。

有关更多信息,请参阅: