I have two DTOs. UsersDTO and UserDTO. UsersDTO are showing in swagger, because I have an endpoint to get users list, and for that endpoint I have
@ApiOkResponse({ status: HttpStatus.OK, type: UsersDTO, })
In UsersDTO I’m using UserDTO using $ref. UsersDTO looks like
export class UsersDTO { @ApiProperty({ type: 'array', items: { $ref: getSchemaPath(UserDTO) }, }) @IsArray() readonly items: UserDTO[]; @ApiProperty({ type: 'object', properties: { totalItems: { type: 'number', example: 100, }, itemCount: { type: 'number', example: 10, }, itemsPerPage: { type: 'number', example: 10, }, totalPages: { type: 'number', example: 10, }, currentPage: { type: 'number', example: 2, }, }, }) @IsObject() readonly meta: IMeta; }
But it doesn’t work in swagger. Swagger show [string]
as a value for the items
.
Is there any way to make it work?
Advertisement
Answer
Looks like you dont have another endpoint that is using UserDTO in @ ApiOkResponse, like
@ApiOkResponse({ status: HttpStatus.OK, type: UserDTO, })
It means that the Swagger cant make references between the Schemas.
If you add another endpoint, for example, to get a single user, and use provided @ApiOkResponse, it will work.
But, if you don’t need that endpoint, you also can provide DTO Schemas to Swagger on the setup stage in the following way
const document = SwaggerModule.createDocument( app, new DocumentBuilder() .setTitle('API') .setDescription('API') .setVersion('1.0') .addBearerAuth() .build(), { extraModels: [UserDTO] }, ); SwaggerModule.setup(swaggerPath, app, document);
You can use it to add the Schemas that are not used in the endpoints directly using @ApiOkResponse decorator. extraModels
is an aray with needed Schemas