学习 Nestjs,请教一下自定义管道不生效的Nodejs问题

发布于 1周前 作者 ionicwang 来自 nodejs/Nestjs

core/controller/user/user.controller.ts 文件里引用了自定义的管道 ValidationPipe

但是为什么 core/pipe/validation-pipe.ts 这个管道不生效呀

if (!metatype || !this.toValidate(metatype)) { return value; }

这里两个值都是 false ,后面就不运行了,没有进行类型校验
学习 Nestjs,请教一下自定义管道不生效的Nodejs问题

5 回复

管道的正常执行流程就是要么直接返回一个值,要么就抛出异常。

你说两个值都是 false ,取反后不就将 value 返回了吗?

你预期的流程是什么?不妨开调试打个断点单步跟一下。


就是一直是两个 false 是我疑惑的地方,参考这里 https://article.juejin.cn/post/7172343322403405854#heading-14 预期的就是我在请求是 body 的参数里数据格式与预期不符报错,比如 string 类型传成 number 类型


你这上下文缺少的有点厉害,示例仓库居然在另一个帖子里 = =。

你控制器方法签名里,类型声明写成了 any,管道里获取不到元数据类型(metatype),所以你取到的值应该是 undefined,后面逻辑都不走了。
你把控制器里 body 的类型定义为 UserCreateDto,再试下。

不好意思,没注意仓库没贴进来,试了一下,确实是 body 里这个类型定义的问题,改掉就跑通了

学习 NestJS 时遇到自定义管道不生效的问题,通常可能是由几个常见原因引起的。以下是一些排查和解决问题的步骤,以及相关的代码示例。

1. 确保管道正确实现

首先,确保你的自定义管道实现了 PipeTransform 接口。例如:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';

@Injectable()
export class MyCustomPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (!value) {
      throw new BadRequestException('Validation failed');
    }
    return value; // 或进行其他转换
  }
}

2. 正确绑定管道

在控制器或方法上正确绑定管道。例如:

import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { MyCustomPipe } from './my-custom.pipe';

@Controller('example')
export class ExampleController {
  @Post()
  @UsePipes(new MyCustomPipe())
  create(@Body() body: any) {
    return body;
  }
}

注意,这里使用了 new MyCustomPipe() 来实例化管道。如果管道依赖于其他服务,应使用依赖注入。

3. 检查其他中间件/过滤器

确保没有其他中间件或过滤器干扰了管道的执行。

4. 调试和日志

transform 方法中添加 console.log 语句,检查管道是否被调用。

通过以上步骤,你应该能够定位并解决自定义管道不生效的问题。如果问题仍然存在,建议检查 NestJS 的文档或搜索具体的错误信息。

回到顶部