NestJS小技巧02-一个正确的API版本

814 阅读2分钟
by 雪隐 from https://juejin.cn/user/1433418895994094 本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权

大家好我是雪隐,请叫我雪宝,欢迎收看我的第二集提示和技巧。这一次,我想谈谈NestJ中API版本控制的鲜为人知的特性,以及如何正确地实现它。

API版本控制

NestJS8引入了API版本控制。以前主要通过设置前缀或创建中间件来完成,定义Controller的版本可以更简单、优雅地完成。还有三种不同的口味😉

例子:

在正确阅读文档之前,我只使用了一个前缀来定义控制器的版本:

@Controller('v1/app')
export class AppV1Controller {
  constructor(private readonly appService: AppV1Service) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

但是,NestJs团队似乎已经对此进行了一些思考,并允许将控制器或方法的版本直接严格地设置为@controller@version中的选项参数:

@Controller({ path: 'app', version: '1' })
export class AppV1Controller {
  constructor(private readonly appService: AppV1Service) {}

  @Get()
  // @Version('1') -> Will override the controller version
  getHello(): string {
    return this.appService.getHello();
  }
}

变化不大吧?-正确,但通过遵循此实践,您可以使项目确定应以以下方式之一使用哪个版本的控制器或方法:

  1. URI版本控制:版本将在请求的URI内传递(默认)
async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // URI版本控制
  app.enableVersioning({ type: VersioningType.URI });

  await app.listen(3000);
}

Url:  http://localhost:3000/v1/app

  1. Header版本控制:自定义请求Header将指定版本
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  // `Header`版本控制
  app.enableVersioning({ type: VersioningType.HEADER, header: 'version' });  

  await app.listen(3000);
}

Url:  http://localhost:3000/app 

Header: version:1

  1. 媒体类型版本控制:请求的Accept头将指定版本
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  // 媒体类型版本控制
  app.enableVersioning({ type: VersioningType.MEDIA_TYPE, key: 'version=' });

  await app.listen(3000);
}

Url:  http://localhost:3000/app

HeaderAccept:application/json;version=v1

命名

版本控制中的另一个重要治理应该是控制器的命名。我建议始终使用以下名称创建具有相关版本的控制器和服务:

  • app.v1.controller.ts
  • app.v1.service.ts

当然,对于一个或两个新版本方法,您可以使用@version decorator和以前的版本控制器在其中声明它们,但从长远来看,您可以将每个版本隔离在单独的文件中,以避免在混合版本调用中运行。

结论

如果您已经“手动”为控制器指定了版本,我强烈建议您使用NestJS所描述的版本控制实践。我很确定这一功能将来会扩展到通过生成新的控制器和更多功能来直接处理文件命名…

当然,如需更多详细信息,您可以在此处找到官方文档