Тело запроса не отображается в 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.