版本控制允许您在同一应用程序中运行**不同版本的控制器或单独的路由。应用程序变化非常频繁,您需要进行重大更改,同时仍需要支持应用程序的先前版本,这并不罕见。
版本控制类型
- 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
});