NestJS實(shí)現(xiàn)接口的多版本管理
創(chuàng)建和運(yùn)行項(xiàng)目
首先,我們需要創(chuàng)建一個新的 NestJS 項(xiàng)目,并啟動服務(wù):
nest new version-test -p pnpm cd version-test nest g resource TestVersion --no-spec pnpm start:dev
啟用接口版本控制
在 main.ts
文件中,引入版本控制功能,并設(shè)置版本信息通過 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
裝飾器指定接口版本。
例如,將默認(rèn)接口設(shè)置為版本 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'; } }
帶上不同的請求頭,獲得的結(jié)果不一樣。
版本中立的接口
如果希望某些接口無論什么版本號如何都能訪問,可以使用 VERSION_NEUTRAL
常量:
import { VERSION_NEUTRAL, Controller, Get } from '@nestjs/common'; @Controller({ path: 'test-version', version: VERSION_NEUTRAL }) export class NeutralAaaController { // 接口實(shí)現(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, });
在這個設(shè)置下,如果客戶端需要訪問版本 1 的 API,URL 應(yīng)該像這樣:
http://localhost:3000/v1/users
對于版本 2,URL 應(yīng)該是:
http://localhost:3000/v2/users
這種方式使得版本控制非常明顯,客戶端一看 URL 就能明白所請求的 API 版本。但可能會導(dǎo)致 URL 空間的膨脹。
注意這種方式不支持 VERSION_NEUTRAL
,需要明確版本號:
@Controller({ path: 'test-version', version: ["2", "3"] })
自定義版本控制邏輯
如果內(nèi)置的版本控制方式不滿足需求,可以實(shí)現(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實(shí)現(xiàn)接口的多版本管理的詳細(xì)內(nèi)容,更多關(guān)于NestJS接口管理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node?NPM庫string-random生成隨機(jī)字符串學(xué)習(xí)使用
這篇文章主要為大家介紹了node?NPM庫string-random生成隨機(jī)字符串學(xué)習(xí)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識)
這篇文章主要介紹了總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07使用DNode實(shí)現(xiàn)php和nodejs之間通信的簡單實(shí)例
這篇文章主要介紹了使用DNode實(shí)現(xiàn)php和nodejs之間通信的簡單實(shí)例,本文講解了DNode的安裝,以及使用的它的步驟和方法,需要的朋友可以參考下2015-07-07NodeJS模塊與ES6模塊系統(tǒng)語法及注意點(diǎn)詳解
這篇文章主要給大家介紹了關(guān)于NodeJS模塊與ES6模塊系統(tǒng)語法及注意點(diǎn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問題
無論是前端還是后端,經(jīng)常出現(xiàn)的應(yīng)用場景是URL中參數(shù)的處理,下面這篇文章主要給大家介紹了關(guān)于Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08