Soy nuevo en nestjs y me quedé atascado creando un cuerpo de respuesta común para todas las API. Actualmente, estoy utilizando el mapa para obtener la respuesta de la colección, pero no tengo idea de cómo formatear la respuesta de la manera que se menciona a continuación.
Actualmente estoy recibiendo un cuerpo de respuesta como el siguiente:
Response body [ { "userId": "602a0f175bbd45688cd001f4", "firstName": "Gagan", "lastName": "Pandya", "email": "gagankumar.pandya@galaxyweblinks.in", "status": "active" }, { "userId": "603f3b547508bbd77a3d6fb5", "firstName": "Kunal", "lastName": "Ghosh", "email": "kunal.ghosh@galaxyweblinks.in", "status": "active" } ]
Necesito configurarlo como-
{ "statusCode": 200, "message": "User Listing", "data":[ { "userId": "602a0f175bbd45688cd001f4", "firstName": "Gagan", "lastName": "Pandya", "email": "gagankumar.pandya@galaxyweblinks.in", "status": "active" }, { "userId": "603f3b547508bbd77a3d6fb5", "firstName": "Kunal", "lastName": "Ghosh", "email": "kunal.ghosh@galaxyweblinks.in", "status": "active" } ] }
A continuación se muestra el código de mi controlador:
@Get('/users-listing') // @UseGuards(AuthGuard('jwt')) // @Roles('Super Admin') @ApiOperation({ title: 'Lists of users' }) @ApiOkResponse({}) @HttpCode(HttpStatus.OK) async getAllUsers() { return this.usersService.findAllUsers(); }
Y busque el código del archivo service.ts:
async findAllUsers(): Promise<User[]> { const users = await this.userModel.find().exec(); const usersArr = []; await Promise.all( users.map(async users => { usersArr.push({ userId: users._id, firstName: users.firstName, lastName: users.lastName, email: users.email, status: users.status }); }), ); return usersArr; } Thanks in advance!
Crear un interceptor de transformación dado
import { Injectable, NestInterceptor, ExecutionContext, CallHandler, } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; export interface Response<T> { statusCode: number; message: string; data: T; } @Injectable() export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> { intercept( context: ExecutionContext, next: CallHandler ): Observable<Response<T>> { return next.handle().pipe( map((data) => ({ statusCode: context.switchToHttp().getResponse().statusCode, reqId: context.switchToHttp().getRequest().reqId, message: data.message || '', data: data, })) ); } }
Agregue el interceptor superior al controlador
@UseInterceptors(TransformInterceptor)
exportar clase DocumentController {}
Finalmente, devuelva la respuesta del controlador.
Cada respuesta pasará a través de este interceptor y creará un formato de respuesta estático.
Puede modificar el interceptor según sus necesidades.
Espero que lo siguiente te ayude
import { Body, Controller, Get, Param, Res, HttpStatus, } from '@nestjs/common'; @Get('/users-listing') // @UseGuards(AuthGuard('jwt')) // @Roles('Super Admin') @ApiOperation({ title: 'Lists of users' }) @ApiOkResponse({}) async getAllUsers(@Res() res) { const users = this.usersService.findAllUsers(); return res.status(HttpStatus.OK).json({ status: 'success', data: { users, } }); }