如何在NestJs中实现媒体类型转换?

问题描述

使用media-type-versioning时,端点的不同版本应具有相同的URL,客户端可以将Accept标头设置为所需的版本:例如

Accept: application/vnd.adventure-works.v1+json

对于版本2:

Accept: application/vnd.adventure-works.v2+json

控制器的伪代码


    @Controller('orders')
    export class OrdersController {
    
      @Get('orders/:id')
      getordersV1(@Headers('Accept') acceptHeader: string) {
        // accept header must be 'application/vnd.adventure-works.v1+json'
        return {
          orderId: 1,orderName: 'Order 1'
        };
      }
    
      @Get('orders/:id')
      getordersV2(@Headers('Accept') acceptHeader: string) {
        // accept header must be 'application/vnd.adventure-works.v2+json'
        return {
          orderId: 1,name: 'Order 1'
        };
      }
  • 如何在nestJs中实现呢?
    即,我需要以某种方式告诉nestJs路由器,仅当accept-header具有固定值时才应调用端点对应的函数
  • 这可以与nestjs-swagger一起使用吗?

#Update 找到了相关的功能请求:#3569

解决方法

您可以尝试以下方法:

  @Get('orders/:id')
  getOrders(@Headers('Accept') acceptHeader: string) {
    //Implement a manager class say OrderManager
    OrderManager orderManager = new OrderManager(); // Better to @Inject in constructor
    switch(acceptHeader) {
        case ''application/vnd.adventure-works.v1+json'':
            return orderManager.getOrdersV1();
        case ''application/vnd.adventure-works.v2+json'':
            return orderManager.getOrdersV2();
        default:
            // throw new InvalidInputException() if needed
            break;
    }
  }