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