比如第一版开发了路由 aaa,假设后面我们又开发了一版接口,但路由还是 aaa,怎么做?
nest new version-demo
创建 aaa 模块
nest g resource aaa --no-spec
跑起来
npm run start:dev
又开发了一版接口,但路由还是 aaa 怎么区分开 ?
不带 version 请求不到
带上 version
想所有版本都能访问这个接口,可以用 VERSION_NEUTRAL 这个常量
但此时都一样 如何区分开
单独建一个 version 2 的 controller
nest g controller aaa/aaa-v2 --no-spec --flat
更新为
import { Controller, Get, Version } from '@nestjs/common';
import { AaaService } from './aaa.service';
@Controller({
path: 'aaa',
version: '2',
})
export class AaaV2Controller {
constructor(private readonly aaaService: AaaService) {}
@Get()
findAllV2() {
return this.aaaService.findAll() + '222';
}
}
一般是这样做,有一个 Controller 标记为 VERSION_NEUTRAL,其他版本的接口放在单独 Controller 里
注意,controller 之间同样要注意顺序,前面的 controller 先生效
除了用自定义 header 携带版本号,还可以这样
此处需要这样写
这些指定版本号的方式都不满足需求,可以自己写
main.ts
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.HEADER,
// header: 'version',
// type: VersioningType.URI,
// });
const extractor = (request: Request) => {
if (request.headers['disable-custom']) {
return '';
}
return request.url.includes('fuhao') ? '2' : '1';
};
app.enableVersioning({
type: VersioningType.CUSTOM,
extractor,
});
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
如果 url 里包含 fuhao,就返回版本 2 的接口,否则返回版本 1