如何在 Nest.js 中获取嵌套 URL 查询

LaC*_*deM 8 javascript node.js typescript routeparams nestjs

我有 NestJS 应用程序,我必须从 URL 获取查询。问题是我的creationDate是一个对象,我无法通过@Query将其作为嵌套对象获取。

以下是路线示例:

xxx/yyy/orders?key1=value&key2=value&key3=value&createdAt[lte]=2021-07-01&createdAt[gte]=2011-03-30&orderBy=desc&limit=500
Run Code Online (Sandbox Code Playgroud)

我正在尝试将createdAt[lte]和createdAt[gte]作为嵌套对象

export interface QueryI {
key1: string;
key2: string;
key3: string;
key4: string;
createdAt: {
    lte: string,
    gte: string,
}
orderBy: 'desc' | 'asc';
limit: number;
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

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

但这给了我以下结果

{

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

}
Run Code Online (Sandbox Code Playgroud)

我尝试过 JSON.stringify 并在 SOW 上咨询了类似的问题,但没有运气。

谢谢

LaC*_*deM 3

编辑

最后,我实现了不同的类并使用 @Pipe 来验证我的查询:这是代码:

管道.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;
  }
Run Code Online (Sandbox Code Playgroud)

控制器.ts

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

查询参数.ts

import { CreatedAt } from "./created-at";

export class QueryParameters {
    key1: string;
    key2: string;
    createdAt: CreatedAt;
}
Run Code Online (Sandbox Code Playgroud)

创建-at.ts

export class CreatedAt {
    lte: string;
    gte: string;

    constructor(lte: string, gte: string){
        this.lte = lte;
        this.gte = gte;
    };
}
Run Code Online (Sandbox Code Playgroud)

好吧,我已经找到了部分解决方案,我将其发布在这里,直到出现更好的答案:我将嵌套属性提取到单独的查询中并创建我的模型。它并不完美,但它现在正在完成工作......

控制器.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);
}
Run Code Online (Sandbox Code Playgroud)

创建的AtModel.ts

    export class CreatedAt {
    lte: string;
    gte: string;

    constructor(lte: string, gte: string){
        this.lte = lte;
        this.gte = gte;
    };
}
Run Code Online (Sandbox Code Playgroud)

我的模型.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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我确信更好的答案在于使用 NestJS 验证管道,但我没有找到适合我的答案。