繁体   English   中英

如何在 NestJS 中使参数成为必需的?

[英]How to make param required in NestJS?

我想让我的路由Query参数成为必需参数。 如果它丢失了,我希望它会抛出 404 HTTP 错误。

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

我正在使用NestJs 管道来确定参数是否有效,但如果它存在则不是,而且我不确定管道是否为此而制作。

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

使用class-validator 管道绝对是为此而制造的!

示例: create-user.dto.ts

import { IsNotEmpty } from 'class-validator';

export class CreateUserDto {
   @IsNotEmpty()
   password: string;
}

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

和 NestJS 管道和验证文档: https : //docs.nestjs.com/pipes https://docs.nestjs.com/techniques/validation

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
  }
)

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

@Get()
async someMethod(@QueryRequired('requiredParam') requiredParam: string): Promise<any> {
    ...
}

有一个简单的方法来验证你的参数, https: //docs.nestjs.com/techniques/validation

除了 Phi 的回答之外,您还可以将class-validator使用与以下全局验证管道相结合:

app.useGlobalPipes(
    new ValidationPipe({
      /*
            If set to true, instead of stripping non-whitelisted 
            properties validator will throw an exception.
      */
      forbidNonWhitelisted: true,
      /*
            If set to true, validator will strip validated (returned) 
            object of any properties that do not use any validation decorators.
      */
      whitelist: true,
    }),
  );

我使用它是为了只允许在 DTO 类中定义的参数,以便在请求发送未知参数时会抛出错误!

在 Phie 的示例中,当{password: 'mypassword', other: 'reject me!'}不会通过验证时,具有类似{password: 'mypassword'}正文的 post 请求将通过验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM