NestJS实现接口的多版本管理

 更新时间:2024年06月13日 08:42:44   作者:云牧  
在软件开发中,随着应用的迭代更新,经常需要引入新的接口版本同时保留旧版本以保证向后兼容,本教程将通过 NestJS 框架演示如何实现接口的多版本管理,感兴趣的小伙伴跟着小编一起来看看吧

创建和运行项目

首先,我们需要创建一个新的 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,并为新版本创建专门的接口:

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 {
  // 接口实现
}

其他版本控制方式

NestJS 还支持通过媒体类型(Media Type)或 URI 路径来控制版本:

Media Type

版本信息通过 Accept 头部传递:

app.enableVersioning({
    type: VersioningType.MEDIA_TYPE,
    key: 'vvv='
})

如果客户端希望请求版本 1 的 API,它需要在 HTTP 请求的 Accept 头部中加入如下内容:

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"]
})

自定义版本控制逻辑

如果内置的版本控制方式不满足需求,可以实现自定义版本控制逻辑:

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实现接口的多版本管理的详细内容,更多关于NestJS接口管理的资料请关注脚本之家其它相关文章!

相关文章

  • nodejs导出excel的方法

    nodejs导出excel的方法

    这篇文章主要介绍了nodejs导出excel的方法,实例分析了nodejs导出excel的详细步骤与相关技巧,需要的朋友可以参考下
    2015-06-06
  • nvm安装、配置与使用例子

    nvm安装、配置与使用例子

    nvm 全称为 node.js version management,顾名思义是用于管理多个 nodejs 的版本控制工具,通过 nvm 可以安装和切换不同版本的 nodejs,这篇文章主要介绍了nvm安装、配置与使用详解,需要的朋友可以参考下
    2025-05-05
  • Node.js实现兼容IE789的文件上传进度条

    Node.js实现兼容IE789的文件上传进度条

    这篇文章给大家介绍了如何实现兼容IE789的文件上传进度条,如果你的工作用过上传图片或上传大文件啥的,一般在IE低版本浏览器里,会切换到用flash解决,可是有些人肯定不会为了老旧IE的进度条而去学flash,那么下面来一起看看吧。
    2016-09-09
  • 详解Node.js开发中的express-session

    详解Node.js开发中的express-session

    express-session 是基于express框专门用于处理session的中间件,本篇文章主要介绍了详解Node.js开发中的express-session,有兴趣的可以了解一下<BR>
    2017-05-05
  • Node.js环境下Koa2添加travis ci持续集成工具的方法

    Node.js环境下Koa2添加travis ci持续集成工具的方法

    这篇文章主要给大家介绍了在Node.js环境下Koa2添加travis ci持续集成工具的方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • 详解使用PM2管理nodejs进程

    详解使用PM2管理nodejs进程

    本篇文章主要介绍了详解使用PM2管理nodejs进程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 浅谈node模块与npm包管理工具

    浅谈node模块与npm包管理工具

    这篇文章主要介绍了node模块与npm包管理工具,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • nodejs npm错误Error:UNKNOWN:unknown error,mkdir ''D:\Develop\nodejs\node_global''at Error

    nodejs npm错误Error:UNKNOWN:unknown error,mkdir ''D:\Develop\n

    今天小编就为大家分享一篇关于nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Node.js版本发布策略频率与稳定性的平衡

    Node.js版本发布策略频率与稳定性的平衡

    这篇文章主要为大家介绍了Node.js版本发布策略频率与稳定性的平衡,帮助大家大家更清晰了解node发展史,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Node.js连接MySQL数据库的操作步骤

    Node.js连接MySQL数据库的操作步骤

    在现代 Web 开发中,与数据库的交互是不可避免的一部分,Node.js提供了许多库和模块,使得连接和操作 MySQL 数据库变得相对简单,本文将介绍如何使用Node.js连接MySQL数据库,并进行一些基本的操作,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论