在 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;
  }
}