当前位置: 代码网 > it编程>前端脚本>Node.js > NestJS实现接口的多版本管理

NestJS实现接口的多版本管理

2024年07月03日 Node.js 我要评论
创建和运行项目首先,我们需要创建一个新的 nestjs 项目,并启动服务:nest new version-test -p pnpmcd version-testnest g resource tes

创建和运行项目

首先,我们需要创建一个新的 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接口管理的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com