NestJS API多版本

132 阅读2分钟

版本控制允许您在同一应用程序中运行**不同版本的控制器或单独的路由。应用程序变化非常频繁,您需要进行重大更改,同时仍需要支持应用程序的先前版本,这并不罕见。

版本控制类型

  • URI Versioning 版本将在请求的 URI 中传递(默认)
  • Header Versioning 自定义请求标头将指定版本
  • Media Type Versioning 请求的Accept标头将指定版本
//URI
https://example.com/v1/route
https://example.com/v2/route

//Header Versioning 
Custom-Header: v2

//Media Type
Accept: application/json;v=2

URI 版本控制

URI 中的版本将自动以 v 为前缀,但是可以通过将前缀键设置为您想要的前缀来配置前缀值,如果您希望禁用它,则可以设置为 false。

main.ts

const app = await NestFactory.create(AppModule);
// or "app.enableVersioning()"
app.enableVersioning({
  type: VersioningType.URI,
});
await app.listen(3000);

标头版本控制

main.ts

const app = await NestFactory.create(AppModule);
app.enableVersioning({
  type: VersioningType.HEADER,
  header: 'Custom-Header',
});
await app.listen(3000);

媒体类型版本控制

const app = await NestFactory.create(AppModule);
app.enableVersioning({
  type: VersioningType.MEDIA_TYPE,
  key: 'v=',
});
await app.listen(3000);

用法

版本控制允许您对控制器、单个路由进行版本控制,并且还为某些资源提供了一种选择退出版本控制的方法。无论您的应用程序使用何种版本控制类型,版本控制的使用都是相同的。

cats.controller.ts

//控制器
@Controller({
  version: '1',
})
export class CatsControllerV1 {
  @Get('cats')
  findAll(): string {
    return 'This action returns all cats for version 1';
  }
}

//路由//////////////////////////
import { Controller, Get, Version } from '@nestjs/common';

@Controller()
export class CatsController {
  @Version('1')
  @Get('cats')
  findAllV1(): string {
    return 'This action returns all cats for version 1';
  }

  @Version('2')
  @Get('cats')
  findAllV2(): string {
    return 'This action returns all cats for version 2';
  }
}

//多个版本///////////////////////////
@Controller({
  version: ['1', '2'],
})
export class CatsController {
  @Get('cats')
  findAll(): string {
    return 'This action returns all cats for version 1 or 2';
  }
}

// 版本“中性”///////////////////////////
//一些控制器或路由可能不关心版本,并且无论版本如何都具有相同的功能。为了适应这种情况,可以将版本设置为VERSION_NEUTRAL符号。
import { Controller, Get, VERSION_NEUTRAL } from '@nestjs/common';

@Controller({
  version: VERSION_NEUTRAL,
})
export class CatsController {
  @Get('cats')
  findAll(): string {
    return 'This action returns all cats regardless of version';
  }
}

//全局默认版本////////////////////////////
//如果您不想为每个控制器/或单个路由提供版本,或者如果您希望将特定版本设置为每个未指定版本的控制器/路由的默认版本
app.enableVersioning({
  // ...
  defaultVersion: '1'
  // or
  defaultVersion: ['1', '2']
  // or
  defaultVersion: VERSION_NEUTRAL
});