接口可不可以多版本共存?

0 阅读1分钟

比如第一版开发了路由 aaa,假设后面我们又开发了一版接口,但路由还是 aaa,怎么做?

nest new version-demo

创建 aaa 模块

nest g resource aaa --no-spec

跑起来

npm run start:dev

image.png

又开发了一版接口,但路由还是 aaa 怎么区分开 ?

image.png

image.png

image.png

不带 version 请求不到

image.png

带上 version

image.png

image.png

想所有版本都能访问这个接口,可以用 VERSION_NEUTRAL 这个常量

但此时都一样 如何区分开

image.png

单独建一个 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 先生效

image.png

image.png

image.png

除了用自定义 header 携带版本号,还可以这样

image.png

此处需要这样写

image.png

image.png

image.png

这些指定版本号的方式都不满足需求,可以自己写

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

image.png

image.png

image.png