NestJs實(shí)現(xiàn) API 版本管理功能的示例代碼
隨著應(yīng)用的更新和功能的迭代,API 會(huì)不斷增加新的功能或做出一些破壞性更改。如果沒(méi)有合適的版本控制機(jī)制,一旦客戶端調(diào)用的 API 版本過(guò)時(shí)或出現(xiàn)不兼容的更改,就會(huì)導(dǎo)致客戶端無(wú)法正常工作。API 版本管理可以幫助我們:
- 保證現(xiàn)有客戶端的穩(wěn)定性。
- 允許新的 API 功能發(fā)布,不破壞已有的接口。
- 更好地管理后端和客戶端之間的兼容性。
接下來(lái)在這篇文章中我們將了解到如何在 NestJs 中實(shí)現(xiàn)多版本管理。
基礎(chǔ)配置
在 NestJS 中,版本管理通過(guò) @nestjs/common 提供的 enableVersioning() 方法來(lái)啟用。你可以在應(yīng)用啟動(dòng)時(shí)設(shè)置如何管理 API 的版本,NestJS 提供了多種控制版本的方式:路徑、查詢參數(shù)、請(qǐng)求頭等。
enableVersioning 是用來(lái)啟用 API 版本管理的關(guān)鍵方法,它接受一個(gè)配置對(duì)象。常見(jiàn)的配置方式如下:
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { VersioningType } from "@nestjs/common";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableVersioning({
type: VersioningType.URI,
prefix: "v",
});
await app.listen(3000);
}
bootstrap();
在上述代碼中,我們啟用了版本管理,并指定了使用路徑作為版本控制的方式,同時(shí)版本號(hào)將作為路徑的一部分,前綴是 v。這意味著請(qǐng)求 URL 會(huì)像 http://localhost:3000/v1/cats 和 http://localhost:3000/v2/cats。
通過(guò)控制器和版本實(shí)現(xiàn)不同的接口
接下來(lái),我們通過(guò)創(chuàng)建不同版本的控制器來(lái)管理不同版本的接口。
在 NestJS 中,你可以在控制器中使用 @Controller() 裝飾器的 version 屬性來(lái)為每個(gè)控制器指定版本號(hào)。
import { Controller, Get, Version } from "@nestjs/common";
import { AppService } from "./app.service";
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
@Version("1")
getHello(): string {
return this.appService.getHello();
}
@Get()
@Version("2")
getHi(): string {
return "this.appService.getHello()";
}
}
最簡(jiǎn)單的方式就是這樣,直接調(diào)用 version 的裝飾器,指定版本號(hào),最終結(jié)果如下圖所示:


我們也可以直接在 Controller 裝飾器中指定整個(gè)路由,如下所示:
import { Controller, Get, Version } from "@nestjs/common";
import { AppService } from "./app.service";
@Controller({
path: "", // 這里指定了路由路徑
version: "1", // 這里指定了版本號(hào)
})
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
@Get()
getHi(): string {
return "this.appService.getHello()";
}
}
這個(gè)時(shí)候我們?cè)L問(wèn) v2 是訪問(wèn)不到的了,而訪問(wèn) v1 是可以訪問(wèn)的:


和前面的不同,當(dāng)訪問(wèn) URL 時(shí),NestJS 會(huì)根據(jù)版本號(hào)來(lái)選擇正確的控制器。
版本控制的不同方式
NestJS 提供了幾種方式來(lái)控制 API 的版本,你可以根據(jù)實(shí)際需求選擇適合的版本控制方式。
最常見(jiàn)的方式是通過(guò) URL 路徑來(lái)控制 API 版本。在我們前面的例子中,已經(jīng)展示了如何通過(guò) v1, v2 等路徑來(lái)區(qū)分不同版本的接口。路徑版本控制簡(jiǎn)潔明了,適用于大多數(shù)場(chǎng)景。
app.enableVersioning({
type: VersioningType.Query, // 使用查詢參數(shù)作為版本控制方式
defaultVersion: "1", // 默認(rèn)版本為 v1
});
你還可以通過(guò)請(qǐng)求頭中的 Accept 字段來(lái)控制版本號(hào)。使用這種方式時(shí),客戶端需要在請(qǐng)求中帶上自定義的 Accept 頭來(lái)指定版本號(hào)。
配置如下:
app.enableVersioning({
type: VersioningType.Header, // 使用請(qǐng)求頭版本控制
});
客戶端可以在請(qǐng)求中添加自定義的 Accept 頭來(lái)指定版本號(hào):
version: 1 訪問(wèn) v1 版本。 version: 2 訪問(wèn) v2 版本。
此時(shí),API 的版本將通過(guò) Header 參數(shù)傳遞。例如:


更多更復(fù)雜的控制方式還可以使用 custom,更多用法可以參考官方文檔:

總結(jié)
NestJS 提供了非常靈活且強(qiáng)大的 API 版本管理功能,支持通過(guò)路徑、查詢參數(shù)、請(qǐng)求頭等多種方式來(lái)控制 API 的版本。你可以根據(jù)實(shí)際需求選擇合適的版本控制方式,并通過(guò)不同的控制器實(shí)現(xiàn)不同版本的 API。同時(shí),合理的版本管理策略能夠確保 API 的穩(wěn)定性和兼容性,避免對(duì)現(xiàn)有客戶端造成影響。
到此這篇關(guān)于NestJs實(shí)現(xiàn) API 版本管理功能的示例代碼的文章就介紹到這了,更多相關(guān)NestJs API 版本管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Javascript在HTML中顯示實(shí)時(shí)時(shí)間
這篇文章主要為大家詳細(xì)介紹了使用Javascript在HTML中顯示實(shí)時(shí)時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
JS實(shí)現(xiàn)數(shù)組刪除指定元素功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)數(shù)組刪除指定元素功能,涉及javascript數(shù)組遍歷、排序、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
原生js簡(jiǎn)單實(shí)現(xiàn)放大鏡特效
這篇文章主要為大家詳細(xì)介紹了原生js簡(jiǎn)單實(shí)現(xiàn)放大鏡特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
js實(shí)現(xiàn)遮罩層劃出效果是生成div而不是顯示
單純的遮蓋層劃出是比較簡(jiǎn)單的,而本例介紹的這個(gè)就有點(diǎn)難度,生成div,而不是顯示存在的div,需要的朋友可以參考下2014-07-07
bootstrap table服務(wù)端實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了bootstrap table服務(wù)端實(shí)現(xiàn)分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
javascript計(jì)算當(dāng)月剩余天數(shù)(天數(shù)計(jì)算器)示例代碼
本文介紹了利用Javascript在網(wǎng)頁(yè)上計(jì)算當(dāng)前月份的剩余天數(shù)的方法,大家參考使用吧2014-01-01
JavaScript中無(wú)法通過(guò)div.style.left獲取值的解決方法
這篇文章主要介紹了JavaScript中無(wú)法通過(guò)div.style.left獲取值的問(wèn)題分析及解決方法,需要的朋友可以參考下2017-02-02

