š Response to DTO mapper for NestJS and Swagger with class-transformer
npm install nestjs-response-dto-mapper
A progressive Node.js framework for building efficient and scalable server-side applications.
yarn add nestjs-response-dto-mapper
`$3
1. Create a DTO class using at least one class-transformer decorator for each field:
`typescript
import { ApiProperty } from '@nestjs/swagger';
import { Expose } from 'class-transformer';export class UserDto {
@Expose()
@ApiProperty({ description: 'ID' }) // or you can use
@nestjs/swagger CLI plugin
id: number; @Expose()
@ApiProperty({ description: 'First name' })
firstName: string;
@Expose()
@ApiProperty({ description: 'Last name' })
lastName: string;
@Expose()
@ApiProperty({ description: 'Email' })
email: string;
@Expose()
@ApiProperty({ description: 'Phone number' })
phone: string;
}
`2. Decorate each controller method with the
MapResponseToDto decorator:
`typescript
import { Controller, Get } from '@nestjs/common';
import { ApiOperation } from '@nestjs/swagger';
import { MapResponseToDto } from 'nestjs-response-dto-mapper';
import { User as UserModel } from '@prisma/client'; // for exampleimport { UserDto } from './dto/user.dto';
@Controller('user')
export class UserController {
@Get()
@ApiOperation({ summary: 'List all users' }) // or you can use @nestjs/swagger CLI plugin
@MapResponseToDto(UserDto, { / ApiOkResponse decorator options / isArray: true })
findMany(): UserModel[] {
// for example
return [
{
id: 1,
firstName: 'Example',
lastName: 'Example',
email: 'example@example.com',
phone: '+99999999999',
password: '$2y$10$gN9UIb8EjkhNWxu8iRJQOe/kAk1TqhtJ1M72DKx.BrpgyAe7XURhq',
rights: 'user'
},
{
id: 2,
firstName: 'Test',
lastName: 'Test',
email: 'test@example.com',
phone: '+88888888888',
password: '$2y$10$Mrh1URLy.Fo8tmBZtaPd5OR.1gDaPvU7GX02./uK9kKz.Skoc2C5y',
rights: 'user'
},
{
id: 3,
firstName: 'Admin',
lastName: 'Admin',
email: 'admin@example.com',
phone: '+88005553535',
password: '$2y$10$qi8oDsLM88XMw4ZStIE7pOG6yZNceqDTVOp0ajLIOk2ttyIcPF9r.',
rights: 'admin'
}
]
}
}
`3. Run and test it!
Swagger schema:

Response:
`json
[
{
"id": 1,
"firstName": "Example",
"lastName": "Example",
"email": "example@example.com",
"phone": "99999999999"
},
{
"id": 2,
"firstName": "Test",
"lastName": "Test",
"email": "test@example.com",
"phone": "+88888888888"
},
{
"id": 3,
"firstName": "Admin",
"lastName": "Admin",
"email": "admin@example.com",
"phone": "+88005553535"
}
]
`Troubleshooting
> I use the @nestjs/swagger CLI Plugin and my method returns an array of objects, but the swagger does not display the method summary and response schema
Try casting the return value to the dto type:
`typescript
// controller...
export class UserController {
// ...
findMany(): UserDto[] {
// findMany returns UserModel[]
return this.userService.findMany() as UserDto[];
}
}
``