在 NestJS 中检查查询参数的一种简洁方法
A clean way to check for query parameter in NestJS
我有一个主要在 RESTful 结构中的 nestjs 项目。一切正常,但我担心的是某些路由会检查是否存在某些查询参数以获取数据。
例如
@Get('/some-resources')
async getSomeResource(
@Query() query: any
): Promise<HTTPResponseDTO>{
const startDate = query.startDate ? DateTime.fromISO(query.startDate).startOf('day').toISO(): null;
const endDate = query.endDate ? DateTime.fromISO(query.endDate).endOf('day').toISO() : null;
.
.
.
const result = await this.someResourceService.findAll(startDate, endDate,...)
}
现在我的问题是,是否有更简洁的方法来解决这个问题?因为当我们有很多资源时,维护起来会很痛苦。
您可以使用 built-in 验证管道:https://docs.nestjs.com/techniques/validation with the auto validation feature.
正如 Micael Levi 所提到的,您应该能够通过创建自己的自定义管道来做到这一点。假设您发布的内容有效,您应该能够按照以下方式做一些事情:
@Get('/some-resources')
async getSomeResource(
@Query('startDate', ParseDateIsoPipe) startDate?: string,
@Query('endDate', ParseDateIsoPipe) endDate?: string
): Promise<HTTPResponseDTO>{
<code>
}
使用您的 ParseDateIsoPipe 如下(请注意,您仍然需要从您正在使用的包中导入 DateTime):
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class ParseDateIsoPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
return value ? DateTime.fromISO(value).startOf('day').toISO(): null;
}
}
我有一个主要在 RESTful 结构中的 nestjs 项目。一切正常,但我担心的是某些路由会检查是否存在某些查询参数以获取数据。 例如
@Get('/some-resources')
async getSomeResource(
@Query() query: any
): Promise<HTTPResponseDTO>{
const startDate = query.startDate ? DateTime.fromISO(query.startDate).startOf('day').toISO(): null;
const endDate = query.endDate ? DateTime.fromISO(query.endDate).endOf('day').toISO() : null;
.
.
.
const result = await this.someResourceService.findAll(startDate, endDate,...)
}
现在我的问题是,是否有更简洁的方法来解决这个问题?因为当我们有很多资源时,维护起来会很痛苦。
您可以使用 built-in 验证管道:https://docs.nestjs.com/techniques/validation with the auto validation feature.
正如 Micael Levi 所提到的,您应该能够通过创建自己的自定义管道来做到这一点。假设您发布的内容有效,您应该能够按照以下方式做一些事情:
@Get('/some-resources')
async getSomeResource(
@Query('startDate', ParseDateIsoPipe) startDate?: string,
@Query('endDate', ParseDateIsoPipe) endDate?: string
): Promise<HTTPResponseDTO>{
<code>
}
使用您的 ParseDateIsoPipe 如下(请注意,您仍然需要从您正在使用的包中导入 DateTime):
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class ParseDateIsoPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
return value ? DateTime.fromISO(value).startOf('day').toISO(): null;
}
}