Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实现nest中未定义参数的入参校验

实现nest中未定义参数的入参校验

作者头像
神奇的程序员
发布于 2022-04-10 01:49:52
发布于 2022-04-10 01:49:52
3.9K00
代码可运行
举报
运行总次数:0
代码可运行

前言

当我们在dto层定义好参数字段后,客户端在调用时传入了未定义的字段,此时我们需要报错告知客户端这个字段不存在,在nest中默认不会报错,本文将分享这个问题的解决方案,欢迎各位感兴趣的开发者阅读本文。

场景概述

我们继续用文章“使用NestJS搭建服务端应用[1]”所创建的项目,以此为基础来描述这个问题,如下所述代码所示,我们在AppDto.ts中定义了三个字段。

  • id
  • title
  • name
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export class AppDto {
  @MinLength(5)
  @IsString()
  public id!: string;
  @IsString()
  public title!: string;
  @IsString()
  public name!: string;
}

随后,我们启动项目,使用postman调用接口,传多一个age字段,这个字段我们未曾在AppDto中定义,调用接口后,如下图所示,接口调用成功了,这并不是我们的期望结果,我们希望它报错。

image-20220214230136474

❝小tips:在Java中,我们在实体类中定义了字段,SpringBoot在处理客户端参数,对其进行序列化时,就可以直接抛出异常。

解决方案

在解决这个问题时,我在网络上检索了一波,没发现合适的方案,最后,求助了一波网友,得到的方案是自己在controller层写方法遍历参数的所有key对其进行校验,然后抛出异常。我觉得这是下下策,自己写方法校验太繁琐了,不利于维护。

尝试解决

突然,有个网友告诉了我forbidUnknownValues这个关键词,打开了我的眼界,让我看到了希望。

image-20220214231807475

经过一番检索后,找到了有关它的详细文档,如下所示:

image-20220214232409975

看到这个后,嘴角疯狂上扬,在main.ts中的全局管道总开启了这个配置项,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe({ forbidUnknownValues: true }));
  await app.listen(3000);
}
bootstrap();

本以为万事大吉了,执行结果却不尽人意🌚

image-20220214233144828

问题解决

此时的我,陷入了沉思,按照描述应该是这个参数才对啊。沉思间,我看到了whitelistforbidNonWhitelisted字段。

  • whitelist 如果设置为true,验证器将剥离任何不使用任何装饰器的属性的验证对象。
  • forbidNonWhitelisted 如果设置为true,则验证程序将抛出异常,而不是剥离非白名单属性。

dto中未声明的字段一定是没有装饰器的,满足了whitelist字段,白名单的属性验证不通过时,让验证器抛出异常,正好满足了forbidNonWhitelisted属性,这样应该就成了吧,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true })
  );
  await app.listen(3000);
}
bootstrap();

继续使用postman进行调用接口进行测试,完美实现了我们想要的效果。

image-20220214234129804

示例代码

本文中所列举的完整代码请移步:

  • main.ts[2]
  • AppDto.ts[3]

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

参考资料

[1]使用NestJS搭建服务端应用: https://juejin.cn/post/7053840108331466783

[2]main.ts: https://github.com/likaia/nest-project/blob/eaf58d92614f3135d808869f47d587a3c0933782/src/main.ts#L5

[3]AppDto.ts: https://github.com/likaia/nest-project/blob/f4aad471419597b6a525219fc73d61b887b3b47b/src/dto/AppDto.ts#L3

[4]个人网站: https://www.kaisir.cn/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神奇的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一个参数验证,学会 Nest.js 的两大机制:Pipe、ExceptionFilter
前端做表单的验证基本不用自己写,有很多 validation 的库,大家写的也比较多了。后端的验证大家可能写的相对较少,今天我们就来学下后端框架 Nest.js 如何做参数的验证吧。
神说要有光zxg
2021/12/29
1.5K0
一个参数验证,学会 Nest.js 的两大机制:Pipe、ExceptionFilter
从零开始的 Nest.js
Nest.js 久有耳闻了,但是一直没有时间去真正学习他,一直鸽子到了现在。我想借着学习 nest 的先进思想,来重构我的博客后端。
Innei
2021/12/28
1.8K0
Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换
在 Nest.js 中,管道(Pipelines) 是一种强大的功能,用于预处理进入控制器方法的请求数据,如请求体、查询参数、路径参数等。管道允许开发者在数据到达控制器方法之前对数据进行转换、验证、清理或执行其他预处理任务。这使得 Nest.js 应用更加健壮、可维护和一致。
白雾茫茫丶
2024/07/22
3630
Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换
Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?
上一篇介绍了如何使用寥寥几行代码就实现 RBAC 0,解决了权限管理的痛点,这篇将解决另一个痛点:写文档。
一只图雀
2020/04/17
4.9K0
Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?
NestJS 7.x 折腾记: (5) 管道,一个好玩的东西!比如入参校验!
意思就git的提交记录以单行显示的前三条,而且提交概要中有build这个词的 在nest里面的管道,主要是用来做入参数据类型的拦截转换; 跟ng提供的概念差不多,大同小异~~
CRPER
2022/03/08
1.2K0
NestJS 7.x 折腾记: (5) 管道,一个好玩的东西!比如入参校验!
学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)
最近接到一个小需求,需要自己全干(前端+后端),看到群里大家对Nest.js热情都很高,自己也心痒痒,所以就走上了 Nest.js 的不归路~
玖柒的小窝
2021/11/21
11.2K0
学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)
学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)
最近接到一个小需求,需要自己全干(前端+后端),看到群里大家对Nest.js热情都很高,自己也心痒痒,所以就走上了Nest.js的不归路~
五月君
2021/11/30
15.3K2
学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)
使用NestJS搭建服务端应用
最近有个需求需要基于前端技术栈实现一套中间层API接口,用于处理由前端维护的一套JSON配置文件。
神奇的程序员
2022/04/10
2.2K0
使用NestJS搭建服务端应用
快速打开 Nestjs 的世界
src目录是主要的源码目录,主要由入口文件 main.ts 和 一组 module,service,controller构成。
前端小鑫同学
2023/12/04
9250
快速打开 Nestjs 的世界
BFF与Nestjs实战
主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green, qklhk-chocolate
乐圣
2022/11/19
2.9K0
BFF与Nestjs实战
nestjs中如何使用class-validator和class-transformer
前面两篇文章分别介绍了class-validator和class-transformer的使用,接着聊一下如何在nestjs中使用这两个包。
挥刀北上
2024/04/22
1.3K0
nestjs中如何使用class-validator和class-transformer
学习NestJS开发小程序后台(一)
前一篇写NestJS的特点,使用NestJS,开启我们的Hello World! 以及NestJS各种热更新方法,本篇会写NestJS在实际项目中的应用。(ORM、参数校验、全局错误处理等等)
一起重学前端
2024/09/12
6310
Nest.js 从零到壹系列(四):使用中间件、拦截器、过滤器打造日志系统
上一篇介绍了如何使用 JWT 进行单点登录,接下来,要完善一下后端项目的一些基础功能。
一只图雀
2020/04/07
6.8K0
NestJS学习总结篇
完整版本,点击此处查看 http://blog.poetries.top/2022/05/25/nest-summary
前端进阶之旅
2022/05/27
2.6K0
NestJs 管道(Pipe)
在 Nestjs 中管道是具有 @Injectable() 装饰器且已实现 PipeTransform 接口的类。
前端小鑫同学
2023/10/16
5790
NestJs 管道(Pipe)
【Nest教程】集成Swagger自动生成接口文档
现如今,前后台开发分离已成为一种标准,后台负责提供api,其余功能交给前台来实现,但是项目开发中的沟通成本也随之提高,这部分成本主要体现在前台需要接口文档,但是后台可能没时间写或者其他原因,导致功能对接缓慢。Swagger很好的解决了这个问题,它可以动态生成Api接口文档,今天我们简单说下在Nest项目中集成Swagger。
青年码农
2021/02/03
2.9K0
【Nest教程】集成Swagger自动生成接口文档
【Nest教程】Nest项目配置http和https
一般,我们的项目如果不是有特别需要,是不会去考虑https的,但是在某些情况下,如,你打算把你的程序发布在微信上,就必须配置https,今天我们就结合前面的教程,配置https。证书用的是阿里云的免费证书。
青年码农
2021/02/03
3.8K1
【Nest教程】Nest项目配置http和https
【Nest教程】数据验证class-validator
说白一点,就是一个接口,必定有必填字段和字段的要求,如果前台调用这个接口,字段不符合,应正确提示不符合的字段,class-validator 用于入的数据验证。
青年码农
2021/02/03
2.1K0
【Nest教程】数据验证class-validator
【Nest教程】自定义拦截器处理处理响应数据
前面讲了基于Nest生成Web API项目,如果不清楚请移步:【Nest教程】基于Nest初始化Web API项目,文章只讲解了使用脚手架搭建简单的项目并且可以正常运行。
青年码农
2021/01/18
1.7K0
【Nest教程】自定义拦截器处理处理响应数据
Nest系列教程之入门篇
Nest 用于构建高效且可扩展的服务器端应用程序的渐进式 Node.js 框架,深受 Angular 的启发。
阿宝哥
2019/11/06
1.6K0
Nest系列教程之入门篇
相关推荐
一个参数验证,学会 Nest.js 的两大机制:Pipe、ExceptionFilter
更多 >
交个朋友
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验