ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 版本控制 > **提示**:本章仅与基于 HTTP 的应用程序相关。 版本控制允许您在同一应用程序中运行**不同版本的控制器或单独的路由。**应用程序**变化非常频繁,您需要进行重大更改,同时仍需要支持应用程序的先前版本,这并不罕见。 支持 3 种类型的版本控制: | | | | --- | --- | | `URI Versioning ` | 版本将在请求的 URI 中传递(默认)| | `Header Versioning` | 自定义请求标头将指定版本 | | `Media Type Versioning` | 请求的`Accept`标头将指定版本 | ## URI 版本控制类型(URI Versioning)[#](#uri-versioning-type) URI 版本控制使用在请求的 URI 中传递的版本,例如`https://example.com/v1/route`和`https://example.com/v2/route`。 > **注意**使用 URI 版本控制,版本将自动添加到 URI 中[全局路径前缀](https://docs.nestjs.com/faq/global-prefix)(如果存在)之后,任何控制器或路由路径之前。 要为您的应用程序启用 URI 版本控制,请执行以下操作: >main.ts ~~~typescript const app = await NestFactory.create(AppModule); // or "app.enableVersioning()" app.enableVersioning({ type: VersioningType.URI, }); await app.listen(3000); ~~~ > **注意**默认情况下,URI 中的版本将自动以 `v` 为前缀,但是可以通过将前缀键设置为您想要的前缀来配置前缀值,如果您希望禁用它,则可以设置为 false。 > **提示**:`VersioningType` 枚举可用于 `type` 属性,并从 `@nestjs/common` 包中导入。 ## 标头版本控制类型(Header Versioning)[#](#header-versioning-type) 标头版本控制使用自定义的、用户指定的请求标头来指定标头的值将是用于请求的版本的版本。 标头版本控制的 HTTP 请求示例: 要为您的应用程序启用**标头版本控制**,请执行以下操作: >main.ts ~~~typescript const app = await NestFactory.create(AppModule); app.enableVersioning({ type: VersioningType.HEADER, header: 'Custom-Header', }); await app.listen(3000); ~~~ 该`header`属性应该是包含请求版本的标头的名称。 > **提示**:`VersioningType` 枚举可用于 `type` 属性,并从 `@nestjs/common` 包中导入。 ## 媒体类型 版本控制类型(Media Type Versioning)[#](https://docs.nestjs.com/techniques/versioning#media-type-versioning-type) 媒体类型版本控制使用`Accept`请求的标头来指定版本。 在`Accept`标头中,版本将与媒体类型用分号分隔,`;`.然后它应该包含一个键值对,表示用于请求的版本,例如`Accept: application/json;v=2`.在确定要配置为包含键和分隔符的版本时,它们的键更多地被视为前缀。 要为您的应用程序启用**媒体类型版本控制**,请执行以下操作: >main.ts ~~~typescript const app = await NestFactory.create(AppModule); app.enableVersioning({ type: VersioningType.MEDIA_TYPE, key: 'v=', }); await app.listen(3000); ~~~ 该`key`属性应该是包含版本的键值对的键和分隔符。例如`Accept: application/json;v=2`,该`key`属性将设置为`v=`。 > **提示**:`VersioningType` 枚举可用于 `type` 属性,并从 `@nestjs/common` 包中导入。 ## 用法[#](#usage) 版本控制允许您对控制器、单个路由进行版本控制,并且还为某些资源提供了一种选择退出版本控制的方法。无论您的应用程序使用何种版本控制类型,版本控制的使用都是相同的。 > **注意**如果为应用程序启用了版本控制,但控制器或路由未指定版本,则对该控制器/路由的任何请求都将返回`404`响应状态。类似地,如果接收到的请求包含没有对应控制器或路由的版本,也会返回`404`响应状态。 #### 控制器版本[#](#controller-versions) 可以将版本应用于控制器,为控制器内的所有路由设置版本。 要将版本添加到控制器,请执行以下操作: >cats.controller.ts ~~~typescript @Controller({ version: '1', }) export class CatsControllerV1 { @Get('cats') findAll(): string { return 'This action returns all cats for version 1'; } } ~~~ #### 路由版本[#](#route-versions) 一个版本可以应用于单个路由。此版本将覆盖任何其他会影响路由的版本,例如控制器版本。 要将版本添加到单个路由,请执行以下操作: >cats.controller.ts ~~~typescript 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'; } } ~~~ #### 多个版本[#](https://docs.nestjs.com/techniques/versioning#multiple-versions) 多个版本可以应用于控制器或路由。要使用多个版本,您可以将版本设置为数组。 要添加多个版本,请执行以下操作: >cats.controller.ts ~~~typescript @Controller({ version: ['1', '2'], }) export class CatsController { @Get('cats') findAll(): string { return 'This action returns all cats for version 1 or 2'; } } ~~~ #### 版本“中性”[#](#version-neutral) 一些控制器或路由可能不关心版本,并且无论版本如何都具有相同的功能。为了适应这种情况,可以将版本设置为`VERSION_NEUTRAL`符号。 传入的请求将被映射到`VERSION_NEUTRAL`控制器或路由,无论请求中发送的版本如何,除非请求根本不包含版本。 > **注意**对于 URI 版本控制,`VERSION_NEUTRAL`资源的版本不会出现在 URI 中。 要添加版本中性控制器或路由,请执行以下操作: >cats.controller.ts ~~~typescript 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'; } } ~~~ ## 全局默认版本[#](#global-default-version) 如果您不想为每个控制器/或单个路由提供版本,或者如果您希望将特定版本设置为每个未指定版本的控制器/路由的默认版本,则可以设置 `defaultVersion` 如下: >main.ts ~~~typescript app.enableVersioning({ // ... defaultVersion: '1' // or defaultVersion: ['1', '2'] // or defaultVersion: VERSION_NEUTRAL }); ~~~