【问题标题】:Versioning Nestjs routes?对 Nestjs 路由进行版本控制?
【发布时间】:2018-05-31 09:25:36
【问题描述】:

我刚刚开始使用Nestjs,我想知道如何使用路由前缀或通过 Express Router 实例对我的 API 进行版本控制?

理想情况下,我希望通过以下方式访问端点:

/v1
/v2

等等,所以我可以优雅地降级端点。我没有看到可以在哪里添加版本前缀。我知道可以在应用程序实例上设置global prefix,但这不适用于一组特定的端点。

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    这是关于RouterModule https://github.com/nestjs/nest/issues/255 的公开讨论。我了解此功能的重要性,因此它应该会在不久的将来出现。此时需要将v1/v2直接放入@Controller()装饰器中。

    【讨论】:

    • 感谢您的链接!这也回答了我关于如何分组路线的另一个问题。
    • 很好的建议,现在我们有了 nest-route 包,但我仍然想问,您是否觉得将版本路由前缀添加到控制器级别而不是模块级别有任何缺点(如 nest-route 包中的建议) )
    【解决方案2】:

    Router Module 助您一臂之力,Nest RouterModule 现在可以轻松组织您的路线。

    看看它是如何轻松设置的。

    const routes: Routes = [
        {
          path: '/ninja',
          module: NinjaModule,
          children: [
            {
              path: '/cats',
              module: CatsModule,
            },
            {
              path: '/dogs',
              module: DogsModule,
            },
          ],
        },
      ];
    
    @Module({
      imports: [
          RouterModule.forRoutes(routes), // setup the routes
          CatsModule,
          DogsModule,
          NinjaModule
          ], // as usual, nothing new
    })
    export class ApplicationModule {}
    

    这将产生如下内容:

    ninja
        ├── /
        ├── /katana
        ├── cats
        │   ├── /
        │   └── /ketty
        ├── dogs
            ├── /
            └── /puppy
    

    当然,为了对路由进行版本控制,您可以这样做

    const routes: Routes = [
        {
          path: '/v1',
          children: [CatsModule, DogsModule],
        },
        {
          path: '/v2',
          children: [CatsModule2, DogsModule2],
        },
      ];
    

    不错!

    看看Nest Router

    【讨论】:

    • 向控制器本身添加版本前缀并在单个模块中包含多个控制器的任何缺点?
    【解决方案3】:

    对于版本或任何前缀,您可以使用“全局前缀”:

    https://docs.nestjs.com/faq/global-prefix

    【讨论】:

      【解决方案4】:

      最好和最简单的方法是使用全局前缀

      下面给出一个例子:

      import { VersioningType } from "@nestjs/common";
           
      app.enableVersioning({
              type: VersioningType.URI,
            });
      
            app.setGlobalPrefix("api/v1"); //edit your prefix as per your requirements!
      

      您可以使用以下构造从全局前缀中排除路由:

      app.setGlobalPrefix('v1', {
        exclude: [{ path: 'health', method: RequestMethod.GET }], // replace your endpoints in the place of health!
      });
      

      或者,您可以将路由指定为字符串(它将适用于每个请求方法):

      app.setGlobalPrefix('v1', { exclude: ['cats'] }); // replace your endpoints in the place of cats!
      

      【讨论】:

        猜你喜欢
        • 2013-01-13
        • 1970-01-01
        • 2011-12-02
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 2017-03-22
        • 1970-01-01
        相关资源
        最近更新 更多