Node.js 如何在express route中创建可选参数名?

Node.js 如何在express route中创建可选参数名?,node.js,express,routes,Node.js,Express,Routes,以下是我的路线代码:- app.get('/server/lead/get/:id?', leadCtrl.get); app.get('/server/lead/filter/:filterQuery', leadCtrl.get); 如上所述,我使用不同的路径访问同一控制器方法leadCtrl.get 现在,我想要类似routeapp.get('/server/lead/get/:id?:filter?',leadCtrl.get)的东西。因此,我可以得到参数,可以是req.params.

以下是我的路线代码:-

app.get('/server/lead/get/:id?', leadCtrl.get);
app.get('/server/lead/filter/:filterQuery', leadCtrl.get);
如上所述,我使用不同的路径访问同一控制器方法
leadCtrl.get


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

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

现在,我想要一些类似路线的东西 app.get('/server/lead/get/:id?:filter?',leadCtrl.get);。所以,我可以 params可以是req.params.id或req.params.filter,但一次只能有一个 时间

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

你的选择 在这里,您几乎没有解决方案:

  • 你可以像以前一样继续使用两条路线

  • 正如Robert在评论中解释的那样,您可以为这两种情况使用一个公共参数

  • 或者您可以使用我认为最适合您的用例的解决方案—命名查询参数—只需使用路由
    /server/lead/get
    ,并使用查询参数传递id和过滤器

  • 示例URL:

    • /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?)
    route,您甚至可以将两者混合使用。您可以在route中使用id,并将filterQuery作为查询参数。现在URL将是:

    • /server/lead/get/xxx
      (用于id)
    • /server/lead/get?filterQuery=xxx
      (用于过滤器)
    有关更多信息,请参阅:

    更好的方法 如果您遵循一些REST约定,则可以使用:

    • app.get('/server/lead/:id'),用于id为(可选)的一个对象
    • 对象列表的app.get('/server/lead')(可选filterQuery作为查询参数传递)
    这样,当您访问时,您将始终知道:

    • /server/lead/xxx
      -那么它就是一个ID=xxx的对象
    • /server/lead
      -那么它就是任何对象的列表
    • /server/lead?filterQuery=xxx
      -然后是一个匹配查询的对象列表
    如果您遵循REST惯例来处理类似的事情,而不是发明自己的,那么您将更容易设计路由和处理程序,其他人也更容易使用您的系统

    您可能还希望使用复数形式,而不是REST中常见的
    /server/lead
    。这样一来,
    leads
    就是一个列表,
    leads/id
    就是其中的一个元素

    有关更多信息,请参阅:


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

        现在,我想要一些类似路线的东西 app.get('/server/lead/get/:id?:filter?',leadCtrl.get);。所以,我可以 params可以是req.params.id或req.params.filter,但一次只能有一个 时间

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

        你的选择 在这里,您几乎没有解决方案:

      • 你可以像以前一样继续使用两条路线

      • 正如Robert在评论中解释的那样,您可以为这两种情况使用一个公共参数

      • 或者您可以使用我认为最适合您的用例的解决方案—命名查询参数—只需使用路由
        /server/lead/get
        ,并使用查询参数传递id和过滤器

      • 示例URL:

        • /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?)
        route,您甚至可以将两者混合使用。您可以在route中使用id,并将filterQuery作为查询参数。现在URL将是:

        • /server/lead/get/xxx
          (用于id)
        • /server/lead/get?filterQuery=xxx
          (用于过滤器)
        有关更多信息,请参阅:

        更好的方法 如果您遵循一些REST约定,则可以使用:

        • app.get('/server/lead/:id'),用于id为(可选)的一个对象
        • 对象列表的app.get('/server/lead')(可选filterQuery作为查询参数传递)
        这样,当您访问时,您将始终知道:

        • /server/lead/xxx
          -那么它就是一个ID=xxx的对象
        • /server/lead
          -那么它就是任何对象的列表
        • /server/lead?filterQuery=xxx
          -然后是一个匹配查询的对象列表
        如果您遵循REST惯例来处理类似的事情,而不是发明自己的,那么您将更容易设计路由和处理程序,其他人也更容易使用您的系统

        您可能还希望使用复数形式,而不是REST中常见的
        /server/lead
        。这样一来,
        leads
        就是一个列表,
        leads/id
        就是其中的一个元素

        有关更多信息,请参阅:


        您必须意识到以下两条路线完全相同:

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