Как реализовать управление версиями типа носителя в NestJS?

#routes #nestjs #nestjs-swagger

#маршруты #гнездо js #nestjs-развязность #nestjs

Вопрос:

При использовании медиа-тип-управление версиями, разных версий конечная точка должна иметь тот же 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 имеет фиксированное значение:
  • будет ли это работать с nestjs-swagger?

Обновить

найден запрос на соответствующую функцию: #3569

Ответ №1:

вы можете попробовать это:

   @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;
    }
  }
  

Комментарии:

1. Что ж, эта реализация работает, но когда у нас есть только один метод, как мы можем сообщить swagger (Open API), какие типы мы возвращаем для каждого заголовка accept? т. е. какие nestjs-swagger-декораторы использовать