这是我的路线代码下方:-

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


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

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

最佳答案

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


  现在,我想要路线
  app.get('/ server / lead / get /:id?:filter?',leadCtrl.get);。所以,我可以
  参数是req.params.id或req.params.filter,但只有一个
  时间。


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

您的选择

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


您可以像以前一样继续使用两条路线。
您可以在两种情况下都使用一个公共参数,如Robert在评论中所述。
或者,您可以使用在我看来适合您的用例的完美解决方案-命名查询参数-只需使用路由/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约定,则可以使用:


一个ID为id的对象的app.get('/ server / lead /: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是其元素之一,将更加明显。

有关更多信息,请参见:


https://en.wikipedia.org/wiki/Representational_state_transfer
http://www.restapitutorial.com/lessons/whatisrest.html
https://spring.io/understanding/REST

关于node.js - 如何在 express route 选择参数名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40742959/

10-11 16:04