在NestJS中设置参数

inf*_*dev 4 javascript node.js express typescript nestjs

我正在启动NestJS(强大的框架!)

我将使我的route Query参数成为必需,否则将引发错误400。

@Controller('')
export class AppController {
  constructor() {}
  @Get('/businessdata/messages')
  public async getAllMessages(
    @Query('startDate', ValidateDate) startDate: string,
    @Query('endDate', ValidateDate) endDate: string,
  ): Promise<string> {
   ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用管道来确定参数是否有效,但不能确定该参数是否存在,而且我不确定是否为此而设计了管道。

那么,如果没有抛出错误,我该如何检查NestJS是否存在我的参数?

小智 11

NestJS 不提供@Query检测 中未定义值的装饰器(如 )request.query[key]

您可以为此编写自定义装饰器:

import { createParamDecorator, ExecutionContext, BadRequestException } from '@nestjs/common'

export const QueryRequired = createParamDecorator(
  (key: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest()

    const value = request.query[key]

    if (value === undefined) {
      throw new BadRequestException(`Missing required query param: '${key}'`)
    }

    return value
  }
)
Run Code Online (Sandbox Code Playgroud)

然后像使用@QueryRequired装饰器一样使用@Query

@Get()
async someMethod(@QueryRequired('requiredParam') requiredParam: string): Promise<any> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是一个可以接受的答案。 (2认同)

小智 5

使用class-validator。烟斗绝对是为此做的!

示例: create-user.dto.ts

import { IsNotEmpty } from 'class-validator';

export class CreateUserDto {
   @IsNotEmpty()
   password: string;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见class-validator文档:https : //github.com/typestack/class-validator

和NestJS Pipes&Validation文档:https : //docs.nestjs.com/pipes https://docs.nestjs.com/techniques/validation

  • 不过,您可以将这种方法用于 `@Query` 参数吗?这些只是字符串。`@Get() getName( @Query name: string) { return name}` (4认同)