Тело запроса не отображается в Nest.js + Swagger

Мой код контроллера выглядит примерно так.

@Controller('customer')
export class CustomerController{

    constructor(private readonly customerService: CustomerService){}

    @Post('lookup')
    async someMethod(@Body() body:any){

        console.log("BEGIN -- CustomerController.someMethod");

Я ожидаю увидеть в Swagger место, где я могу ввести текст в качестве тела запроса, но вместо этого я вижу это

7 ответов

Решение

Похоже, здесь происходит несколько вещей. Пользовательский интерфейс Swagger - это вспомогательный инструмент для отправки запросов, но для этого ему необходимо знать форму тела запроса.anyнедостаточно хорошо. Если вы ищете инструмент, который позволяет отправлять что угодно, curl или postman - лучший вариант (по крайней мере, бесплатно).

У Nest есть плагин Swagger, который будет читать ваш код Typescript и соответствующим образом украшать ваши типы и метод, но вы должны выбрать его, чтобы включить его. В противном случае вам нужно использовать декораторы из@nestjs/swagger пакет, чтобы сообщить Swagger, какие типы ожидаются в методах, а какие - вне их.

Пока тип, соответствующий @Body()имеет декораторы swagger или вы включаете плагин swagger и имеете допустимый класс, пользовательский интерфейс swagger должен отображаться, как ожидалось, но с указанным выше и с использованием типаany это не принесет вам никакой пользы.

Добавить @ApiProperty()

      export class User{

 @ApiProperty()
  name:string
 
}

Моя конечная точка принимает неизвестные данные типа ключ / значение, и у меня была такая же проблема (я пробовал любой, неизвестный, Record <string, any>, object, {}). Наконец-то @Body() data: Map<string, any> работал у меня.

Я бы рекомендовал использовать dto для тела.

Обратитесь к документации .

Пример DTO показан ниже.

ДТО:

      import { ApiProperty } from '@nestjs/swagger';

export class CreateCatDto {
  @ApiProperty()
  name: string;

  @ApiProperty()
  age: number;

  @ApiProperty()
  breed: string;
}

Функция

      @Post()
async create(@Body() createCatDto: CreateCatDto) {
  //Do Stuff.
}

@ApiPropertyдобавляет свойства в запрос чванства.

Это должно показать что-то вроде этого:

      @Post()
@ApiBody({ type: CreateCatDto })
async create(@Body() createCatDto: CreateCatDto) {
  //Do Stuff.
}

Приведенный выше код будет давать вывод, аналогичный приведенному ниже, где ваша схема также будет задокументирована:

Надеюсь это поможет.

попробуйте это так:

      @ApiBody({description: "body:any someMethod"})
@Post('lookup')
async someMethod(@Body() body:any){
console.log("BEGIN -- CustomerController.someMethod");
}

Создайте файл с расширением *.dto.ts и добавьте приведенный ниже код в Nest-cli.json unser compilerOptions. Вам не нужно добавлять @ApiProperty в каждое поле.

      "plugins": [
  {
    "name": "@nestjs/swagger",
    "options": {
      "introspectComments": true
    }
  }
]

Swagger не может интерпретировать ваш код. Это не проблема с вашим кодом. Если ваша цель — протестировать API для использования командой пользовательского интерфейса, а не исчерпывающую документацию по чванству, то проще всего просто использовать Postman. Попробуйте использовать свой API с помощью Postman.

Другие вопросы по тегам