版本控制 Nestjs 路由?

Versioning Nestjs routes?

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

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

/v1
/v2

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

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

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

对于版本或者任何前缀,你可以使用"global prefix":

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

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

例子如下:

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!

根据 main.ts 内的最新文档,在 const app = await NestFactory.create(AppModule) 使用

之后
  // Versioning
  app.enableVersioning({
    type: VersioningType.URI,
    defaultVersion: '1',
    prefix: 'api/v',
  });

除非指定

,否则这将为您的所有路由提供默认前缀 /api/v1

在控制器使用中覆盖版本 @Controller({version:'2'}) 控制器上的装饰器 class

要在路由级别覆盖版本,请使用 @Version('2') 以上控制器方法

注意:如果您使用 swagger,请确保在 SwaggerModule.createDocument()

之前调用 app.enableVersioning()

Link: https://docs.nestjs.com/techniques/versioning