NestJS實現(xiàn)接口的多版本管理
創(chuàng)建和運行項目
首先,我們需要創(chuàng)建一個新的 NestJS 項目,并啟動服務:
nest new version-test -p pnpm cd version-test nest g resource TestVersion --no-spec pnpm start:dev
啟用接口版本控制
在 main.ts 文件中,引入版本控制功能,并設置版本信息通過 HTTP 頭部傳遞:
import { VersioningType } from '@nestjs/common';
import { AppModule } from './app.module';
import { NestFactory } from '@nestjs/core';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableVersioning({
type: VersioningType.HEADER,
header: 'version', // 指定傳遞版本信息的 HTTP 頭部字段名為 'version'
});
await app.listen(3000);
}
bootstrap();
配置版本控制
在控制器中,我們可以通過 @Version 裝飾器指定接口版本。
例如,將默認接口設置為版本 1,并為新版本創(chuàng)建專門的接口:
import { Controller, Get, Version } from '@nestjs/common';
import { TestVersionService } from './test-version.service';
@Controller('test-version')
export class TestVersionController {
constructor(private readonly testVersionService: TestVersionService) {}
@Get()
@Version('1')
findAllV1() {
return this.testVersionService.findAll();
}
@Get()
@Version('2')
findAllV2() {
return this.testVersionService.findAll() + '版本2';
}
}


帶上不同的請求頭,獲得的結果不一樣。
版本中立的接口
如果希望某些接口無論什么版本號如何都能訪問,可以使用 VERSION_NEUTRAL 常量:
import { VERSION_NEUTRAL, Controller, Get } from '@nestjs/common';
@Controller({
path: 'test-version',
version: VERSION_NEUTRAL
})
export class NeutralAaaController {
// 接口實現(xiàn)
}
其他版本控制方式
NestJS 還支持通過媒體類型(Media Type)或 URI 路徑來控制版本:
Media Type
版本信息通過 Accept 頭部傳遞:
app.enableVersioning({
type: VersioningType.MEDIA_TYPE,
key: 'vvv='
})
如果客戶端希望請求版本 1 的 API,它需要在 HTTP 請求的 Accept 頭部中加入如下內(nèi)容:
Accept: application/json;vvv=1
URI 版本控制
版本信息直接在 URL 路徑中指定:
app.enableVersioning({
type: VersioningType.URI,
});
在這個設置下,如果客戶端需要訪問版本 1 的 API,URL 應該像這樣:
http://localhost:3000/v1/users
對于版本 2,URL 應該是:
http://localhost:3000/v2/users
這種方式使得版本控制非常明顯,客戶端一看 URL 就能明白所請求的 API 版本。但可能會導致 URL 空間的膨脹。
注意這種方式不支持 VERSION_NEUTRAL,需要明確版本號:
@Controller({
path: 'test-version',
version: ["2", "3"]
})
自定義版本控制邏輯
如果內(nèi)置的版本控制方式不滿足需求,可以實現(xiàn)自定義版本控制邏輯:
import { VersioningType, NestFactory } from '@nestjs/common';
import { AppModule } from './app.module';
import { Request } from 'express';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const extractor = (request: Request) => {
if (request.headers['disable-custom']) {
return '';
}
return request.url.includes('yun') ? '2' : '1';
};
app.enableVersioning({
type: VersioningType.CUSTOM,
extractor
});
await app.listen(3000);
}
bootstrap();



以上就是NestJS實現(xiàn)接口的多版本管理的詳細內(nèi)容,更多關于NestJS接口管理的資料請關注腳本之家其它相關文章!
相關文章
Node.JS用純JavaScript生成圖片或滑塊式驗證碼功能
有一些Node.JS圖片生成類庫,比如node-captcha等的類庫,需要c/c++程序生成圖片??缙脚_部署不是很方便。這里介紹幾個用純JS實現(xiàn)的圖片驗證碼生成模塊,需要的朋友可以參考下2019-09-09
基于node.js依賴express解析post請求四種數(shù)據(jù)格式
本篇文章主要介紹了node.js依賴express解析post請求四種數(shù)據(jù)格式,主要是www-form-urlencoded,form-data,application/json,text/xml,有興趣的可以了解一下。2017-02-02
node實現(xiàn)shell命令管理工具及commander.js學習
這篇文章主要為大家介紹了node實現(xiàn)shell命令管理工具及commander.js學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09

