如何在 Nest.js 中获取嵌套的 URL 查询
How to get nested URL query in Nest.js
我有 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
我正在尝试将 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;
}
这是我的控制器:
@Get('route')
getAll(
@Query() query: QueryI): Promise<void> {
return this.myService.findAll(query);
}
但这给了我以下结果
{
key1: 'value',
key2: 'value',
key3: 'value',
key4: 'value',
'createdAt[lte]': 'some date',
'createdAt[gte]': 'some date',
orderBy: 'desc',
limit: '500'
}
我试过 JSON.stringify 并在 SOW 上咨询过类似的问题,但没有成功。
谢谢
将 QueryI
从界面切换到 class。
正在使用 NestJS 7。
Url用于测试
http://localhost:3000/api/v1/store/search?nestedObj[key1]=yolo&nestedObj[key2]=sup%20bruh&el=test
已使用 DTO
export class TestDto {
el: string;
nestedObj: {
key1: string;
key2: string;
};
}
控制器
@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' }
编辑
最后我实现了不同的 类 并使用 @Pipe 来验证我的查询:这是代码:
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;
}
controller.ts
@Get(':someurl/someurl')
getAllOrders(
@Query(ValidateQueryPipe) query: QueryParameters): Promise<Observable<any>> {
return this.service.findAll(erpCode, query);
}
查询-parameters.ts
import { CreatedAt } from "./created-at";
export class QueryParameters {
key1: string;
key2: string;
createdAt: CreatedAt;
}
创建-at.ts
export class CreatedAt {
lte: string;
gte: string;
constructor(lte: string, gte: string){
this.lte = lte;
this.gte = gte;
};
}
好吧,我找到了一个部分解决方案,我将 post 放在这里,直到出现更好的答案:
我正在将嵌套属性提取到单独的查询中并创建我的模型。它并不完美,但它现在正在完成工作...
controller.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);
}
createdAtModel.ts
export class CreatedAt {
lte: string;
gte: string;
constructor(lte: string, gte: string){
this.lte = lte;
this.gte = gte;
};
}
我的-model.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)
}
}
我确信更好的答案在于使用 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
我正在尝试将 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;
}
这是我的控制器:
@Get('route')
getAll(
@Query() query: QueryI): Promise<void> {
return this.myService.findAll(query);
}
但这给了我以下结果
{
key1: 'value',
key2: 'value',
key3: 'value',
key4: 'value',
'createdAt[lte]': 'some date',
'createdAt[gte]': 'some date',
orderBy: 'desc',
limit: '500'
}
我试过 JSON.stringify 并在 SOW 上咨询过类似的问题,但没有成功。
谢谢
将 QueryI
从界面切换到 class。
正在使用 NestJS 7。
Url用于测试
http://localhost:3000/api/v1/store/search?nestedObj[key1]=yolo&nestedObj[key2]=sup%20bruh&el=test
已使用 DTO
export class TestDto {
el: string;
nestedObj: {
key1: string;
key2: string;
};
}
控制器
@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' }
编辑
最后我实现了不同的 类 并使用 @Pipe 来验证我的查询:这是代码:
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;
}
controller.ts
@Get(':someurl/someurl')
getAllOrders(
@Query(ValidateQueryPipe) query: QueryParameters): Promise<Observable<any>> {
return this.service.findAll(erpCode, query);
}
查询-parameters.ts
import { CreatedAt } from "./created-at";
export class QueryParameters {
key1: string;
key2: string;
createdAt: CreatedAt;
}
创建-at.ts
export class CreatedAt {
lte: string;
gte: string;
constructor(lte: string, gte: string){
this.lte = lte;
this.gte = gte;
};
}
好吧,我找到了一个部分解决方案,我将 post 放在这里,直到出现更好的答案: 我正在将嵌套属性提取到单独的查询中并创建我的模型。它并不完美,但它现在正在完成工作...
controller.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);
}
createdAtModel.ts
export class CreatedAt {
lte: string;
gte: string;
constructor(lte: string, gte: string){
this.lte = lte;
this.gte = gte;
};
}
我的-model.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)
}
}
我确信更好的答案在于使用 NestJS 验证管道,但我没能找到适合我的那个。