【问题标题】:Nestjs validation pipe not working as expected when using @Param使用@Param 时,Nestjs 验证管道无法按预期工作
【发布时间】:2019-12-13 05:08:59
【问题描述】:

我有一个端点正在使用一个安静的 url service/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"
    ]
}

【问题讨论】:

  • 这可能只是一种类型,但在您的控制器中,您将 URL 路径定义为 /url/:documentId,但在您的错误中,端点位于 service/getDocument/,如果不是,它将解释 404一个错字。
  • 我更改了这些值只是为了在此处发布并错过了更改这两个地方。

标签: parameters controller nestjs class-validator


【解决方案1】:

您不应使用“IsNotEmpty”验证参数。在您的情况下,由于路由路径“getDocument/:documentId”,控制器无法处理空 documentId。你也不应该用‘IsString’来验证它——它总是这样。但是,例如,您可能想要验证长度。

【讨论】:

    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 2017-07-19
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多