NestJs实现 API 版本管理功能的示例代码

 更新时间:2025年08月18日 09:34:30   作者:Moment  
本文主要介绍了NestJS中API版本管理的实现,通过enableVersioning启用,支持路径、请求头等控制方式,确保客户端兼容性,具有一定的参考价值,感兴趣的可以了解一下

随着应用的更新和功能的迭代,API 会不断增加新的功能或做出一些破坏性更改。如果没有合适的版本控制机制,一旦客户端调用的 API 版本过时或出现不兼容的更改,就会导致客户端无法正常工作。API 版本管理可以帮助我们:

  • 保证现有客户端的稳定性。
  • 允许新的 API 功能发布,不破坏已有的接口。
  • 更好地管理后端和客户端之间的兼容性。

接下来在这篇文章中我们将了解到如何在 NestJs 中实现多版本管理。

基础配置

在 NestJS 中,版本管理通过 @nestjs/common 提供的 enableVersioning() 方法来启用。你可以在应用启动时设置如何管理 API 的版本,NestJS 提供了多种控制版本的方式:路径、查询参数、请求头等。

enableVersioning 是用来启用 API 版本管理的关键方法,它接受一个配置对象。常见的配置方式如下:

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();

在上述代码中,我们启用了版本管理,并指定了使用路径作为版本控制的方式,同时版本号将作为路径的一部分,前缀是 v。这意味着请求 URL 会像 http://localhost:3000/v1/catshttp://localhost:3000/v2/cats

通过控制器和版本实现不同的接口

接下来,我们通过创建不同版本的控制器来管理不同版本的接口。

在 NestJS 中,你可以在控制器中使用 @Controller() 装饰器的 version 属性来为每个控制器指定版本号。

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()";
  }
}

最简单的方式就是这样,直接调用 version 的装饰器,指定版本号,最终结果如下图所示:

我们也可以直接在 Controller 装饰器中指定整个路由,如下所示:

import { Controller, Get, Version } from "@nestjs/common";
import { AppService } from "./app.service";

@Controller({
  path: "", // 这里指定了路由路径
  version: "1", // 这里指定了版本号
})
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get()
  getHi(): string {
    return "this.appService.getHello()";
  }
}

这个时候我们访问 v2 是访问不到的了,而访问 v1 是可以访问的:

和前面的不同,当访问 URL 时,NestJS 会根据版本号来选择正确的控制器。

版本控制的不同方式

NestJS 提供了几种方式来控制 API 的版本,你可以根据实际需求选择适合的版本控制方式。

最常见的方式是通过 URL 路径来控制 API 版本。在我们前面的例子中,已经展示了如何通过 v1, v2 等路径来区分不同版本的接口。路径版本控制简洁明了,适用于大多数场景。

app.enableVersioning({
  type: VersioningType.Query, // 使用查询参数作为版本控制方式
  defaultVersion: "1", // 默认版本为 v1
});

你还可以通过请求头中的 Accept 字段来控制版本号。使用这种方式时,客户端需要在请求中带上自定义的 Accept 头来指定版本号。

配置如下:

app.enableVersioning({
  type: VersioningType.Header, // 使用请求头版本控制
});

客户端可以在请求中添加自定义的 Accept 头来指定版本号:

version: 1 访问 v1 版本。
version: 2 访问 v2 版本。

此时,API 的版本将通过 Header 参数传递。例如:

更多更复杂的控制方式还可以使用 custom,更多用法可以参考官方文档:

总结

NestJS 提供了非常灵活且强大的 API 版本管理功能,支持通过路径、查询参数、请求头等多种方式来控制 API 的版本。你可以根据实际需求选择合适的版本控制方式,并通过不同的控制器实现不同版本的 API。同时,合理的版本管理策略能够确保 API 的稳定性和兼容性,避免对现有客户端造成影响。

到此这篇关于NestJs实现 API 版本管理功能的示例代码的文章就介绍到这了,更多相关NestJs API 版本管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • uniapp引用echarts的详细步骤(附柱状图实例)

    uniapp引用echarts的详细步骤(附柱状图实例)

    最近在uni-app搭建的微信小程序项目中使用了ECharts,下面这篇文章主要给大家介绍了关于uniapp引用echarts的详细步骤,文中还附有柱状图实例,需要的朋友可以参考下
    2022-07-07
  • javascript 冒泡排序 正序和倒序实现代码

    javascript 冒泡排序 正序和倒序实现代码

    javascript 冒泡排序 正序和倒序实现代码,需要的朋友可以参考下。
    2010-12-12
  • JS获取IE版本号与HTML设置IE文档模式的方法

    JS获取IE版本号与HTML设置IE文档模式的方法

    下面小编就为大家带来一篇JS获取IE版本号与HTML设置IE文档模式的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • js实现一个简单的MVVM框架示例

    js实现一个简单的MVVM框架示例

    下面小编就为大家分享一篇js实现一个简单的MVVM框架示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • js的event详解。

    js的event详解。

    js的event详解。...
    2006-09-09
  • 禁止别人调试前端代码的几种常见方法

    禁止别人调试前端代码的几种常见方法

    这篇文章主要介绍了介绍了多种避免他人调试前端代码的方法,包括通过不断使用debugger语句、将代码写在一行、检测浏览器窗口尺寸变化、使用定时器执行debugger语句、使用第三方插件disable-devtooldisable-devtool、禁止F12/审查开启控制台等,需要的朋友可以参考下
    2025-01-01
  • JavaScript内存机制之堆内存(Heap)与栈内存(Stack)详解

    JavaScript内存机制之堆内存(Heap)与栈内存(Stack)详解

    文章将JavaScript引擎中的内存分为栈和堆,详细描述了它们的特点、用途、管理方式和垃圾回收机制,通过代码实战演示了基本类型和引用类型的数据存储方式,并解释了闭包和内存泄漏的概念,总结了栈和堆的区别,提供了面试高频问题的回答方法,需要的朋友可以参考下
    2026-05-05
  • javascript巧用eval函数组装表单输入项为json对象的方法

    javascript巧用eval函数组装表单输入项为json对象的方法

    这篇文章主要介绍了javascript巧用eval函数组装表单输入项为json对象的方法,实例分析了JavaScript使用eval函数动态构造json对象的相关技巧,需要的朋友可以参考下
    2015-11-11
  • JS如何理解data URL

    JS如何理解data URL

    这篇文章主要介绍了JS如何理解data URL,对data URL感兴趣的同学,可以参考下
    2021-04-04
  • js使用Canvas将多张图片合并成一张的实现代码

    js使用Canvas将多张图片合并成一张的实现代码

    这篇文章主要介绍了js使用Canvas将多张图片合并成一张的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论