Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

751
Vistas
Cómo obtener una consulta de URL anidada en Nest.js

Tengo la aplicación NestJS. Tengo que obtener la consulta de la URL. El problema es que mi fecha de creación es un objeto y no puedo obtenerlo como objeto anidado a través de @Query.

Aquí hay un ejemplo de la ruta:

 xxx/yyy/orders?key1=value&key2=value&key3=value&createdAt[lte]=2021-07-01&createdAt[gte]=2011-03-30&orderBy=desc&limit=500

Estoy tratando de obtener createdAt[lte] y createdAt[gte] como el objeto anidado

 export interface QueryI { key1: string; key2: string; key3: string; key4: string; createdAt: { lte: string, gte: string, } orderBy: 'desc' | 'asc'; limit: number; }

Aquí está mi controlador:

 @Get('route') getAll( @Query() query: QueryI): Promise<void> { return this.myService.findAll(query); }

pero esto me da el siguiente resultado

 { key1: 'value', key2: 'value', key3: 'value', key4: 'value', 'createdAt[lte]': 'some date', 'createdAt[gte]': 'some date', orderBy: 'desc', limit: '500' }

Probé JSON.stringify y consulté preguntas similares en SOW pero no tuve suerte.

Gracias

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Cambie QueryI de una interfaz a una clase.

Trabajando en NestJS 7.

URL utilizada para la prueba

http://localhost:3000/api/v1/store/search?nestedObj[key1]=yolo&nestedObj[key2]=sup%20bruh&el=test

DTO usado

 export class TestDto { el: string; nestedObj: { key1: string; key2: string; }; }

Controlador

 @Controller('v1/store') @UsePipes(new ValidationPipe({ exceptionFactory: getFormattedErrors })) @UseFilters(DomainExceptionFilter) export class TestController{ @Get('search') public async searchStore(@Query() testDto: TestDto) { console.log(testDto); return 1; } } // Console log - { nestedObj: { key1: 'yolo', key2: 'sup bruh' }, el: 'test' }
over 4 years ago · Santiago Trujillo Denunciar

0

EDITAR

Al final, implementé diferentes clases y usé @Pipe para validar mi consulta: Aquí está el código:

pipa.ts

 @Injectable() export class ValidateQueryPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { let incomingQuery = value as IncomingQuery; let mappedQuery = new QueryParameters() mappedQuery.key1 = incomingQuery.key1 mappedQuery.key2= incomingQuery.key2 // other mapped valus mappedQuery.createdAt = new CreatedAt(incomingQuery['createdAt[lte]'], incomingQuery['createdAt[gte]']) return mappedQuery; }

controlador.ts

 @Get(':someurl/someurl') getAllOrders( @Query(ValidateQueryPipe) query: QueryParameters): Promise<Observable<any>> { return this.service.findAll(erpCode, query); }

consulta-parámetros.ts

 import { CreatedAt } from "./created-at"; export class QueryParameters { key1: string; key2: string; createdAt: CreatedAt; }

creado-en.ts

 export class CreatedAt { lte: string; gte: string; constructor(lte: string, gte: string){ this.lte = lte; this.gte = gte; }; }

Bueno, he encontrado una solución parcial y la publicaré aquí hasta que aparezca una mejor respuesta: estoy extrayendo las propiedades anidadas en consultas separadas y creando mi modelo. No es perfecto, pero está haciendo el trabajo por ahora...

controlador.ts

 getAllOrders( @Query() query, @Query('createdAt[lte]') lte: string, @Query('createdAt[gte]') gte: string): Promise<void> { const mappedObject = new QueryParameters(query, lte, gte) return this.orderService.findAll(erpCode, mappedObject); }

creadoEnModelo.ts

 export class CreatedAt { lte: string; gte: string; constructor(lte: string, gte: string){ this.lte = lte; this.gte = gte; }; }

mi-modelo.ts

 import { CreatedAt } from "./created-at"; export class QueryParameters { //other keys createdAt: CreatedAt; constructor(query, lte, gte){ //other keys this.createdAt = new CreatedAt(lte, gte) } }

Estoy seguro de que la mejor respuesta radica en usar las tuberías de validación de NestJS, pero no logré encontrar la que me funciona.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda