这是我的路线代码下方:-
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.id
或req.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/