typescript - Hur definierar man svarskroppsobjektet i ett NestJs-genererat Swagger-dokument?
Jag använder NestJs och dess Swagger-plugin för att automatiskt generera dokumentation för mitt API.
Problemet är att jag inte kan lista ut hur jag får response-schemat att visas i dokumentationen. I mina GET-rutter får jag bara "Kod 200", utan någon datastruktur.
Jag har en typisk uppsättning, där en kontrollmetod använder en motsvarande tjänstemetod, som i sin tur använder ett TypeOrm-repository. Till exempel:
@Get()
findAll() {
return this.usersService.findAll();
}
Jag försökte använda @ApiResponse-dekorationen, men såg egentligen inget sätt att få den att fylla detta syfte. Dessutom gjorde det ingen nytta att skapa en user.dto.ts och göra den till returtyp för controller-routen.
Till slut är detta vad jag får i Swagger:
Hur kan jag definiera svarskroppens schema?
Svar #1
Du kan använda type och isArray egenskaper tillsammans med ApiResponse-familjen av dekoratörer. Till exempel:
@ApiOkResponse({
description: 'The user records',
type: User,
isArray: true
})
@Get()
findAll() {
return this.usersService.findAll();
}
Dessutom bör du överväga att använda Swagger CLI-pluginet för att hjälpa dig att få dessa dekoratorer tillämpade automatiskt under byggtiden istället för att du måste hålla allt synkroniserat manuellt.
Svar #2
Du kan kommentera kontrolleråtgärden med ApiExtraModels:
import { ApiExtraModels, ApiResponse, getSchemaPath } from '@nestjs/swagger'
import { Controller, Get, Param } from '@nestjs/common';
@Controller('users')
export class UsersController {
@ApiExtraModels(UserDto)
@ApiResponse({
status: 200,
schema: {
$ref: getSchemaPath(UserDto),
},
})
@Get('/:userId')
getById(@Param('userId') userId: string): UserDto {
... something happens ...
return myUserDto;
}
}
och du måste också annotera UserDto-egenskaper med ApiProperty:
import { ApiProperty } from '@nestjs/swagger'
import { Expose } from 'class-transformer'
import { IsString } from 'class-validator'
export class UserDto {
@ApiProperty()
@IsString()
@Expose()
id: string;
}
Förresten, kolla in CLI-pluginen för att generera ApiProperty
