NestJS實(shí)現(xiàn)接口的多版本管理
創(chuàng)建和運(yùn)行項(xiàng)目
首先,我們需要?jiǎng)?chuàng)建一個(gè)新的 NestJS 項(xiàng)目,并啟動(dòng)服務(wù):
nest new version-test -p pnpm cd version-test nest g resource TestVersion --no-spec pnpm start:dev
啟用接口版本控制
在 main.ts 文件中,引入版本控制功能,并設(shè)置版本信息通過(guò) 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();
配置版本控制
在控制器中,我們可以通過(guò) @Version 裝飾器指定接口版本。
例如,將默認(rèn)接口設(shè)置為版本 1,并為新版本創(chuàng)建專(zhuān)門(mén)的接口:
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';
}
}


帶上不同的請(qǐng)求頭,獲得的結(jié)果不一樣。
版本中立的接口
如果希望某些接口無(wú)論什么版本號(hào)如何都能訪問(wèn),可以使用 VERSION_NEUTRAL 常量:
import { VERSION_NEUTRAL, Controller, Get } from '@nestjs/common';
@Controller({
path: 'test-version',
version: VERSION_NEUTRAL
})
export class NeutralAaaController {
// 接口實(shí)現(xiàn)
}
其他版本控制方式
NestJS 還支持通過(guò)媒體類(lèi)型(Media Type)或 URI 路徑來(lái)控制版本:
Media Type
版本信息通過(guò) Accept 頭部傳遞:
app.enableVersioning({
type: VersioningType.MEDIA_TYPE,
key: 'vvv='
})
如果客戶(hù)端希望請(qǐng)求版本 1 的 API,它需要在 HTTP 請(qǐng)求的 Accept 頭部中加入如下內(nèi)容:
Accept: application/json;vvv=1
URI 版本控制
版本信息直接在 URL 路徑中指定:
app.enableVersioning({
type: VersioningType.URI,
});
在這個(gè)設(shè)置下,如果客戶(hù)端需要訪問(wèn)版本 1 的 API,URL 應(yīng)該像這樣:
http://localhost:3000/v1/users
對(duì)于版本 2,URL 應(yīng)該是:
http://localhost:3000/v2/users
這種方式使得版本控制非常明顯,客戶(hù)端一看 URL 就能明白所請(qǐng)求的 API 版本。但可能會(huì)導(dǎo)致 URL 空間的膨脹。
注意這種方式不支持 VERSION_NEUTRAL,需要明確版本號(hào):
@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接口管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node.js實(shí)現(xiàn)兼容IE789的文件上傳進(jìn)度條
這篇文章給大家介紹了如何實(shí)現(xiàn)兼容IE789的文件上傳進(jìn)度條,如果你的工作用過(guò)上傳圖片或上傳大文件啥的,一般在IE低版本瀏覽器里,會(huì)切換到用flash解決,可是有些人肯定不會(huì)為了老舊IE的進(jìn)度條而去學(xué)flash,那么下面來(lái)一起看看吧。2016-09-09
詳解Node.js開(kāi)發(fā)中的express-session
express-session?是基于express框?qū)iT(mén)用于處理session的中間件,本篇文章主要介紹了詳解Node.js開(kāi)發(fā)中的express-session,有興趣的可以了解一下<BR>2017-05-05
Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法
這篇文章主要給大家介紹了在Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
nodejs npm錯(cuò)誤Error:UNKNOWN:unknown error,mkdir ''D:\Develop\n
今天小編就為大家分享一篇關(guān)于nodejs npm錯(cuò)誤Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Node.js版本發(fā)布策略頻率與穩(wěn)定性的平衡
這篇文章主要為大家介紹了Node.js版本發(fā)布策略頻率與穩(wěn)定性的平衡,幫助大家大家更清晰了解node發(fā)展史,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Node.js連接MySQL數(shù)據(jù)庫(kù)的操作步驟
在現(xiàn)代 Web 開(kāi)發(fā)中,與數(shù)據(jù)庫(kù)的交互是不可避免的一部分,Node.js提供了許多庫(kù)和模塊,使得連接和操作 MySQL 數(shù)據(jù)庫(kù)變得相對(duì)簡(jiǎn)單,本文將介紹如何使用Node.js連接MySQL數(shù)據(jù)庫(kù),并進(jìn)行一些基本的操作,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11

