首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Nest.js 从零到壹系列(五):使用管道、DTO 验证入参,摆脱 if-else 恐惧

是否曾经为了验证参数,写了一大堆 if - else ?然后还要判断各种参数类型?相似的结构在不同方法里判断,却又要复制一遍代码?...使用 DTO 可以清晰了解对象结构,使用 Pipes(管道)配合 class-validator 还可以对参数类型进行判断,还可以在验证失败时候抛出错误信息。...数据传输对象DTO)(Data Transfer Object),是一种设计模式之间传输数据软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。...管道两个类型: 转换:管道将输入数据转换为所需数据输出; 验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常; ValidationPipe 是 Nest.js 自带三个开箱即用管道之一...至此,入参验证功能已基本完成,了这些,我们就可以摆脱各种 if - else 来验证入参了(当然,特殊,逻辑比较复杂还是需要)。

4K41

Nest.js 实战系列四:使用管道、DTO 验证入参,摆脱 if-else 恐惧

是否曾经为了验证参数,写了一大堆 if - else ?然后还要判断各种参数类型?相似的结构在不同方法里判断,却又要复制一遍代码?...使用 DTO 可以清晰了解对象结构,使用 Pipes(管道)配合 class-validator 还可以对参数类型进行判断,还可以在验证失败时候抛出错误信息。...数据传输对象DTO)(Data Transfer Object),是一种设计模式之间传输数据软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。...管道两个类型: 转换:管道将输入数据转换为所需数据输出; 验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常; ValidationPipe 是 Nest.js 自带三个开箱即用管道之一...至此,入参验证功能已基本完成,了这些,我们就可以摆脱各种 if - else 来验证入参了(当然,特殊,逻辑比较复杂还是需要)。

3.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

Magicodes.IE之导入学生数据教程

数据验证(包括重复验证),模板验证,读取设置,约束和映射,输出Excel验证标注 主要步骤 1.安装包Magicodes.IE.Excel 在本篇教程中,我们仅演示使用Excel来完成学生数据导入。...,我们定义了以上学生数据Dto,主要注意事项如下: ExcelImporter特性可以设置一些导入全局设置,比如是否标注错误、导入Sheet名称(如不设置则自动获取第一个)、截止读取列数、表头位置...支持列头设置,将ImporterHeaderName属性。除此之外,ImporterHeader还支持自动过滤空格(默认启用)、处理掉所有的空格、列索引等。...通常情况下,我们以下步骤: 验证导入数据 通过Magicodes.IE.Excel导入数据会自动进行验证,并且输出验证结果,以便于前台显示。...最后 整个学生数据导入教程就此结束了。相关库会一直更新,在功能体验上有可能会和本文教程细微出入,请以相关具体代码、版本日志、单元测试示例为准。

48820

接口参数注解验证案例

写作缘由 写接口时候经常会有请求体里某字段不为null需求;也有使用一个dto对象,但是插入和修改都想使用这个dto,那这样的话判断条件就不一样,因为修改操作必须有ID,所以参数验证还是挺麻烦...源码下载 ChaiRongD/Demooo - Gitee.com 注意依赖和注解到底是引用哪个包 请求参数验证 请求参数不为null 首先定义一个dto package com.example.springbootparamvalidatedemo.dto...,会报错,就不贴错误了 {"id":1, "email":"email" } 分组验证 比如经常会有添加和修改某类需求,其实请求里就是一个字段ID是否需要验证,其实这里是可以复用,如果我能告诉系统...这个是插入操作,不需要验证ID,这个是修改操作,必须要验证ID,那就爽歪歪了,不过确实有这种骚操作。...对象,分别标记什么操作下验证什么字段 public class TeacherDto { @NotNull( message = "id不能为", groups = {BaseConstant.Update.class

16010

Magicodes.IE之导入学生数据教程

数据验证(包括重复验证),模板验证,读取设置,约束和映射,输出Excel验证标注 主要步骤 1.安装包Magicodes.IE.Excel 在本篇教程中,我们仅演示使用Excel来完成学生数据导入。...GradeId { get; set; } } 如上述代码所示,我们定义了以上学生数据Dto,主要注意事项如下: ExcelImporter特性可以设置一些导入全局设置,比如是否标注错误、导入...支持列头设置,将ImporterHeaderName属性。除此之外,ImporterHeader还支持自动过滤空格(默认启用)、处理掉所有的空格、列索引等。...通常情况下,我们以下步骤: 验证导入数据 通过Magicodes.IE.Excel导入数据会自动进行验证,并且输出验证结果,以便于前台显示。...支持错误等级(警告、错误) Exception为导入异常信息 HasError为是否存在错误(不包含警告) 通过ImportResult,我们就可以很方便拿到导入验证错误而无须额外编写代码。

54630

C# API中模型和它们接口设计

数据传输对象(Data Transfer Object,DTODTO是只包含属性和集合对象对象图。一个真正DTO没有任何行为,而且几乎是不可变。...不过,在使用代码生成工具生成DTO时,通常会使用一些简单接口(如INotifyPropertyChanged)。 对象图(Object Graph) 一个对象图由一个对象所有可触及对象组成。...换句话说,数据模型所有方法都应该是可预测,而且这种预测只能基于它们属性。 在父对象和子对象之间传递消息 父对象和子对象通常需要交互。如果做得不好,可能会导致难以理解紧密交叉耦合。...立即返回,这会让调用变得不确定,因为你不知道是否存在挂起异步验证请求。...命令式验证另一个限制是它需要使用共享接口,这样才能让应用程序其余部分通过一致方式触发验证表单问题 当用户在创建新记录并未填写所有必填字段时,就会出现表单问题。

1.6K20

单单知道分类正确率是不够,你可以使用更多性能评估指标

在原作者上一篇文章中,提到了如何利用交叉验证和多重交叉验证来评估模型鲁棒性(健壮性),即模型在训练集未设计样本上泛化性。在上一篇文章中主要用了分类正确率和平均分类正确率来作为观测指标。...预测结果都为不复发 如果我们对所有治愈患者说五年内不会再复发,如果实际情况与数据集中一只,此时预测准确率可以达到(201/286)*100即70.28%准确率。...预测结果都为会复发 如果我们把所有的预测都改为会复发,此时准确度为(75/286)* 100即29.72%准确率。...精确率 精确率可以通过正确预测例样本数除以总例样本数得到,也被称为阳性预测(Positive Predictive Value,PPV)。...正如大家料想一样,预测结果都为会复发时,在召回率上表现是完美的,因为它成功预测到了所有的复发样本。由于CART中存在大量误判负例,它召回率要低于全部预测为复发时情况。

1.3K80

入参校验1

默认是true,表示请求中一定要传入对应参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型变量,则必须有,这时会抛出指针异常。...如果允许,则接口中变量需要使用包装类来声明。 defaultValue:参数默认,如果请求中没有同名参数时,该变量默认为此。...,value是long型 byte/short/int/long/float/double及其对应包装类;包装类对象not null时才校验 @Min(value) 限制必须为一个大于等于value指定整数...指定,value是字符串类型 byte/short/int/long/float/double及其对应包装类;包装类对象not null时才校验 @DecimalMin(value) 限制必须大于等于...value指定,value是字符串类型 byte/short/int/long/float/double及其对应包装类;包装类对象not null时才校验 @Digits(integer, fraction

21340

开放平台简单实现(access key & access secret)

所有的客户端发起请求都为 POST 请求,post 请求参数都放在 body 中 { "appId": "fdsafdsafdsaf", "timestamp": 1608190943132,...(access key) timestamp: 时间戳毫秒数 businessData: 业务数据 sign: appSecret + timestamp + businessData MD5 签名...服务端获取到请求后对请求进行验证验证请求类型 ② 验证请求参数合法性 ③ 验证请求时间戳是否过期(比如: 与服务端时间差再±120秒之内) ④ 验证请求签名有效性 4....(比如125秒), 请求发起时先验证请求时间戳是否过期, 如果没过期再验证nonce, 只要发现redis中有对应nonce就直接拒绝访问....request.setAttribute("resultEnum", ResultEnum.PARAMETER_VALIDATE_FAIL); request.setAttribute("message", "请求参数为

2.8K31

ASP.NET Core 实战:基于 Jwt Token 权限控制全揭露

xhr.setRequestHeader("Authorization", "Bearer " + token); }, success: function (data) {} });   当用户拥有令牌后是否就可以访问系统所有功能了呢...每个子应用文件夹(Jwt、Secret)都包含了相同结构:Dto 数据传输对象、功能接口,以及功能接口实现类,这里接口继承采用单继承方式。 ?   ...我们在后面验证时候就可以通过 HttpContext 获取到用户角色信息,从而判断用户是否可以访问当前请求地址。...通过判断当前登录用户角色是否包含请求地址,当用户角色并不包含对于访问地址权限时,返回 403 Forbidden 状态码。   ...在中间件进行 Jwt 验证过程中,会验证授权方式是不是 Bearer 以及通过 token 属性解密之后与生成时用户数据进行比对,从而判断这个 token 是否有效。

2.2K20

DataSet灵活,实体类方便,DTO效率:SOD框架数据容器,打造最适合DDDORM框架

•为了解决性能问题,就不加载一些导航属性,但是却把DB Entity返回上层,这样对象一些属性为,上层使用这个数据时根本不知道什么时间这个属性是,这个是很丑陋是不是?...假设某个表50个字段,这样大表在很多复杂系统中是很常见,于是MAP出来Entity或者DTO,也有50个属性,而我这次仅需要使用其中2个属性,于是,这个对象 48个属性数据都浪费了。...我们还可以通过查询来进一步验证这种情况: 假如我们ORM查询语言OQL查询并没有指定要查询实体类Age属性,那么结果user对象仅有2个数据,并没有3个数据: OQL...但是,如果你服务客户端不是.net,而是JAVA,JS,或者其它不支持可类型语言,这种类型属性DTO就遇上麻烦了。...3.1,综合示例 下面这个查询,动态查询一个实体类属性是否等于指定,或者该属性对应字段在数据库是否,而实现动态查询关键,是使用索引器, 如下面的BatchNumber 属性,查询此属性是否

2.7K90

【译】如何在 Spring 中将 @RequestParam 绑定到对象

原文地址:How to bind @RequestParam to object in Spring[1] 原文作者:Daniel Olszewski[2] 你请求映射方法中是否多个用 @RequestParam...Java 许多内置约束,但你总是可以在需要时 创建自定义验证[5]。...当我们一个 POJO 时,不需要任何特殊魔法。你只需要直接为字段指定默认。当请求中缺少参数时,不会有任何东西覆盖预定义。...请注意,当嵌套对象字段为 null 时,Spring 不会验证其属性。如果所有嵌套属性都是可选,那么这可能是预期解决方案。如果不是,则需在嵌套对象字段上放置 @NotNull 注解。...不可变对象许多好处(也有一些缺点……但嘘)。在我看来,最大好处是 更易于维护。 你是否曾经跟踪你应用程序穿过几十层,以理解什么条件导致了对象特定状态?在哪个地方这个或那个字段发生了变化?

20510

springboot第一集:由springbootdto拓展内容

以下是可以拓展DTO一些内容: Validation 校验 Spring Boot DTO可以使用Bean Validation框架来校验请求数据格式和有效性。...例如,你可以通过在DTO字段上添加@NotBlank和@Email注解来确保输入字符串不为并符合电子邮件地址格式。...Localization 本地化 如果你应用程序需要支持多个国家或地区语言,那么DTO可以包含属性键、相应和区域设置信息,来支持不同本地化需求。...映射注解:DTO可以使用映射注解(例如@Mapper或@Mapping)将DTO属性映射到其他对象属性。 Spring validation支持:DTO可以使用Spring验证框架进行自定义验证。...总之,Spring BootDTO是具有可读/可写属性、静态工厂方法、序列化支持、Bean验证注解、映射注解和Spring验证支持简单Java对象,用于在不同层之间传输数据。

33430

缓存穿透解决方案

为什么用缓存 我们可以这样理解,所有的缓存都是内存数据库,而我们常用oracle和mysql等关系型数据库都是硬盘数据库,两者最大区别就是,内存数据库io速度远大于关系数据库磁盘io,所以查询性能比较好...一种极端情况下,可以对这些接口做恶意非法请求,导致大部分连接不可用,拖垮数据库 解决方案 针对缓存穿透,很多解决方案,最常用就是一下两种: 1)缓存为null查询结果,将null...= obj) {//②查询结果不为空有两种情况,1)存储标识,2)真实数据 if("##".equals(obj.toString())) {//如果返回结果为##(为特殊标识),避免缓存穿透,...= obj)两种情况,一种是缓存中存在真实有效数据,另一种就是存储是标识null特殊字符,如下代码需要优先判断是否是特殊标识,如果是直接返回null给调用方,如果不是特殊字符才转换为有效数据(...否则我们表结构就一览无余暴露给调用方了,在调用方非自己项目组或者非本公司时候是非常不安全) - 第二个标红处将有效数据放入缓存(捕获异常) - 最后返回有效数据 单元测试验证结果 @Test public

53440

3. 用户注册实现

Backend valid 后端校验是为了防止某些不法小伙伴绕开前端从而直接访问我们api造成数据请求服务器错误,或者前端小伙伴程序bug...无论是哪一种可能性,都有可能造成严重后果。...org.n3r.idworker.Sid, 这个是一个开源 分布式ID生成器组件,传送门, 后期有机会的话,会专门写一个id生成器文章。...,那么也就是我们UserRequestDTO对象,所谓DTO就是Data Transfer Object首字母缩写,顾名思义,它是用来传递数据对象。...可以看到,当我们选择create方法时,插件自动帮我们设置请求类型为POST,并且RequestBody默认也帮助我们生成了,我只修改了默认username和password,confimPassword...可以看到,创建用户成功,并且将当前创建用户返回到了我们请求客户端。那么我们继续重复点击创建,会怎么样呢?继续Send: ? 可以看到,我们验证重复用户也已经生效啦。

1.4K20

java代码规范

在-128 至 127 范围内赋值, Integer 对象是在IntegerCache . cache 产生,会复用已有对象,这个区间内 Integer 可以直接使用==进行判断,但是这个区间之外所有数据...控制语句 表达异常分支时,少用 if-else 方式 ,这种方式可以改写成 if (condition) { ... return obj; } 方法返回可以为 null ,不强制返回空集合,或者对象等...可以用 select if(isnull(sum(g)),0,sum(g)) from table; 使用ISNULL()来判断是否为NULL,NULL与任何比较都为NULL。...用户请求传入参数必须进行有效验证:否则导致1.page size 过大内存溢出 2. 恶意order by 导致数据库查询慢3.任意重定向 4.SQL注入 5. 反序列化注入 6....方法返回可以为null,不强制返回空集合和对象,必须添加注释说明什么情况下返回为 其他 在使用正则表达式时要学会利用预编译,加快正则匹配速度,定义正则时候不要在方法体内进行定义。

1.2K20

【Spring】SpringBoot10个参数验证技巧

假设我们一个应用程序,用户可以在其中创建帖子。每个帖子都应该有一个标题和一个正文,并且标题在所有帖子中应该是唯一。...EmailNotEmpty 组将包含当 email 字段不为验证规则,而 Default 组将包含所有三个字段正常验证规则。...进行这些更改后,现在将根据“电子邮件”字段是否对“用户”类进行不同验证。如果为,则 firstName 或 lastName 字段必须非。否则,所有三个字段都将正常验证。...7 对复杂逻辑使用跨域验证 如果需要验证跨多个字段复杂输入规则,可以使用跨字段验证来保持验证逻辑组织性和可维护性。跨字段验证可确保所有输入均有效且彼此一致,从而防止出现意外行为。...然后我们使用 Validator 接口来验证 User 对象并检查是否返回了预期验证错误。 10 考虑客户端验证 客户端验证可以通过向用户提供即时反馈并减少对服务器请求数量来改善用户体验。

37640

Spring Validation实践及其实现原理

常用注解 Bean Validation 2.0 注解 校验 @Null:验证对象是否为 null @NotNull:验证对象是否不为 null @NotEmpty:验证对象不为 null,且长度(...@Min(value):验证数值(整数或浮点数)是否大于等于指定最小 @Max(value):验证数值是否小于等于指定最大 校验布尔 @AssertTrue:验证 Boolean 对象是否为...true @AssertFalse:验证 Boolean 对象是否为 false 校验日期和时间 @Past:验证 Date 和 Calendar 对象是否在当前时间之前 @Future:验证 Date...和 Calendar 对象是否在当前时间之后 @PastOrPresent:验证日期是否是过去或现在时间 @FutureOrPresent:验证日期是否是现在或将来时间 正则表达式 @Pattern...(regexp=, flags=):验证 String 对象是否符合正则表达式规则 Hibernate Validation 拓展 @Length(min=, max=):验证字符串大小是否在指定范围内

32510

从零到一搭建基础架构(3)-base模块搭建上篇

中业务code定义没有一个统一规范 PO、DTO、BO、VO傻傻分不清楚 工具类泛滥,同一工程中StringUtil引用外部引入,内部jar包引入还有自己定义 异常定义混乱,导致在Spring...无法跟前端约定业务code,来让前端在UI上做特定展示。 而http code本身是请求级别的code定义,只是一个泛定义。 比如登陆失败很多种原因:账号不存在,密码错误,账号锁定等等。...再比如,分布式架构体系下,一个请求上涉及很多服务,我们应该有一个统一链路id将所有请求日志串联起来,方便后续日志定位。...发生异常时,依据errorCode定义映射国际化请求响应 "traceId": "", // 链路id,串联请求所关联所有应用日志数据 "data": null // 是的返回业务数据 }...如果只有一个实体情况下,我从数据库里查询出来数据拥有4个字段,把密码传递到前端肯定是不合适。做一下脱敏,将password置为

39950
领券