使用@Param时,Nestjs验证管道无法按预期工作

时间:2019-08-05 16:30:18

标签: parameters controller nestjs class-validator

我有一个使用静态URL服务的端点/ getDocument /:documentId 我已经设置了带有验证的路径对象,并且当使用documentId调用端点时,一切都很好。当我退出documentId时,出现404错误,它没有从@IsNotEmpty消息中获取消息。当我将端点转换为使用@Query时,会收到我期望的消息。

服务

@Controller('service') // Define this class as a controller
export class Controller {
   constructor() {}

  // Gets all prescriptions with pagination
  @Get('getDocument/:documentId')
  async getDocument(
    @Res() res: Response,
    @Param() params: Path,
    @Headers() headers: Headers
  ): Promise<any> {
...

这是我收到的消息

    "message": "Cannot GET /service/getDocument/"

我的dto路径

import { IsString, IsNotEmpty } from 'class-validator';
import { ApiModelProperty } from '@nestjs/swagger';

export class Path {
  @IsString()
  @IsNotEmpty({ message: 'documentId required in url as rest param <serviceURL>/<endpoint>/<documentId>' })
  @ApiModelProperty({
    required: true,
    description: 'document reference id'
  })
  documentId: string;
}

当我将端点转换为使用@Query时,得到了预期的响应。状态422和来自dto的此消息

更新后的控制器

@Get('getDocument')
   async getDocument(
    @Res() res: Response,
    @Query() params: Path,
    @Headers() headers: Headers
  ): Promise<any> {

响应

{
   "errors": [
        "documentId required in url as rest param <serviceURL>/<endpoint>/<documentId>",
        "documentId must be a string"
    ]
}

1 个答案:

答案 0 :(得分:-1)

您不应使用“ IsNotEmpty”验证参数。对于您而言,由于路由路径为“ getDocument /:documentId”,控制器无法处理空的documentId。您也不应该使用“ IsString”对其进行验证-始终如此。但是,例如,您可能想验证长度。