首页/新闻资讯/正文详情

class-validator 验证的5个开关:如何让错误只出现在该出现的地方

发布时间:2026/11/4 16:11:59 来源:云帆数科 栏目:资讯中心
class-validator 验证的5个开关:如何让错误只出现在该出现的地方
class-validator 验证的5个开关如何让错误只出现在该出现的地方【免费下载链接】class-validatorDecorator-based property validation for classes.项目地址: https://gitcode.com/gh_mirrors/cl/class-validator更新用户资料的接口有时 avatar 传空整个请求就被打回有时又希望它放行——问题多半不在装饰器而在validate()没传第二个参数。class-validator 的验证行为可以由 ValidatorOptions 里的5个开关定制返回的错误则统一装在ValidationError结构里。读完这篇你能按接口场景自由组合哪些字段要验、验不过返回什么。10秒看懂开关管什么不管什么ValidatorOptions管验证怎么跑装饰器的ValidationOptionsmessage、groups、each管单个字段怎么验两层各管各的类别选项一句话效果跳过缺失值skipUndefinedProperties/skipNullProperties/skipMissingProperties值为 undefined、null 或两者之一时整个字段不参与验证字段白名单whitelist/forbidNonWhitelisted未加装饰器的属性被删除或触发错误错误输出validationError.target/value、stopAtFirstError控制错误里带不带原对象、遇错是否停消息控制dismissDefaultMessages、enableDebugMessages默认消息是否保留、是否打调试警告它不做的类型转换JSON 变类实例要配 class-transformer、跨字段一致性校验需写自定义约束。缺失值怎么处理三个跳过开关class-validator 把undefined字段没赋值和null显式传 null当成两种缺失分别给了开关skipMissingProperties是两者的并集。原理就一行ValidationExecutor在跑任何验证器前先判值命中开关直接return该字段后续验证全部跳过见 ValidationExecutor.ts 的performValidations。注意IsDefined会绕开这三个开关声明此字段必须存在时用它在字段上标而不是靠跳过开关放行。这段代码演示同一份数据在三种开关下的表现class User { IsEmail() email: string; IsNotEmpty() nickname: string; IsUrl() avatar: string; } const user: any new User(); user.email ab.com; user.avatar null; // 显式 null validate(user).then(e console.log(e.map(x x.property))); // [nickname, avatar] validate(user, { skipMissingProperties: true }).then(e console.log(e.map(x x.property))); // 只剩 [nickname]更新接口的典型配法就是skipMissingProperties: true让未传的可选字段安静通过。这里要注意skipMissingProperties: true只挡 null 和 undefined空字符串照样进验证器。whitelist 和 forbidNonWhitelisted外来字段怎么办两个开关控制没加任何装饰器的属性的命运。配置写法{ whitelist: true }实际效果分两支没开forbidNonWhitelisted时这类属性被直接从对象上delete开了则每个属性生成一条constraints里带whitelist的错误消息为property xxx should not exist原对象保持原样。适用场景是防前端多传参数。源码 ValidationExecutor.ts 的whitelist方法会先扫一遍对象所有 key没有对应元数据的进黑名单然后按上面两支处理。这段代码演示两种模式的差异注意验证后draft.hackerField的变化class Post { IsString() title: string; Min(0) rating: number; } const draft: any new Post(); draft.title hi; draft.hackerField extra; await validate(draft, { whitelist: true }); console.log(draft.hackerField); // undefined已被 delete const draft2: any { ...draftRaw }; await validate(draft2, { whitelist: true, forbidNonWhitelisted: true }); // 返回1条错误原对象不被改动这里要注意whitelist是真删字段不是复制一份再删。想保留原始请求用于日志时先Object.assign({}, obj)浅拷贝再验。如果某个字段只是透传、不需要验证给它标Allow()就能留档不必硬塞一个无意义的验证器。把错误说成人话ValidationError 结构验证结果是一个ValidationError[]每个节点就是一棵树的分支property是属性名value是出错时的值constraints是{ 验证器名: 消息 }嵌套对象的错误挂在children数组里递归展开定义见 ValidationError.ts。控制带什么出去用validationError子选项target和value默认为 true生产环境建议设validationError: { target: false }避免整个对象混进错误响应造成 JSON 循环引用。toString()支持4个参数是否加 ANSI 高亮、是否为子错误、父路径、显示约束名还是约束消息。默认输出长这样An instance of Post has failed the validation: - property title has failed the following constraints: isString - property tags[1] has failed the following constraints: length数组下标会被格式化成[1]这种形式方便直接定位元素这在做批量导入校验日志时特别省事。最小可复现一个更新接口够用的配置下面这段只配了一个开关模拟可选字段允许缺省的更新场景import { IsString, Length } from class-validator; import { validate } from class-validator; class Post { IsString() Length(10, 50) title: string; } const post: any new Post(); post.title hello; // 不足10位 validate(post).then(e console.log(e.length)); // 1title 报 length validate(post, { stopAtFirstError: true }).then(e console.log(Object.keys(e[0].constraints)) ); // [isString]同一字段后续约束不再跑为什么这么写错误收集是每字段先建节点全部验证跑完再删空节点stripEmptyErrors所以默认会拿到字段的全部违规stopAtFirstError: true让每个字段只报第一条约束错误前端表单只需要一句提示时正好省掉噪音。记住选项是每次validate()调用生效的全局配置不同接口该传不同的 options 对象别追求一份配置打天下。避坑清单skipMissingProperties没放行空字符串不是 null/undefined仍会进验证器 → 根因是开关只判null value || undefined value→ 解法字段上补IsOptional()处理空值语义或显式把空串归一化成 undefined 再验。验证完发现请求体里多了个字段消失了whitelist: true直接delete原对象上的属性 → 解法先浅拷贝再验证或者改用forbidNonWhitelisted: true让多传字段显式报错而不是静默蒸发。传了groups才生效不传就全过strictGroups未开启时不传groups的验证会忽略所有带组的装饰器表现像规则失效 → 解法按默认行为给所有验证器补无组配置或接口层强制要求groups参数必要时开strictGroups: true反转默认行为。错误列表莫名变短dismissDefaultMessages: true后未写自定义message的约束产出undefined消息整个错误节点被stripEmptyErrors过滤 → 解法要么给装饰器补message要么别开这个开关。validate({})直接失败forbidUnknownValues默认为 true对没有任何装饰器元数据的裸对象会直接报unknownValue错误 → 解法验普通 JSON 对象时显式传forbidUnknownValues: false或先把对象转成带装饰器的类实例。class-validator 只负责判不负责转入参是原始 JSON 时仍需 class-transformer 先转成类实例跨字段一致性逻辑则要落在自定义约束里。想继续深入可以看 whitelist-validation.spec.ts 里白名单三种行为的完整用例以及 ValidationExecutor.ts 中execute主流程如何串联这些开关。【免费下载链接】class-validatorDecorator-based property validation for classes.项目地址: https://gitcode.com/gh_mirrors/cl/class-validator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

March7thAssistant 上手指南:3 步跑通星穹铁道日常自动化
March7thAssistant 上手指南:3 步跑通星穹铁道日常自动化

March7thAssistant 上手指南:3 步跑通星穹铁道日常自动化 【免费下载链接】March7thAssistant 日常交给三月七,开拓留给你。《崩坏:星穹铁道》开源自动化助手。 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant March… · 2026/11/4 16:11:59

Boxer CLI参数速查表:从阈值到精度,所有命令行选项一次讲透
Boxer CLI参数速查表:从阈值到精度,所有命令行选项一次讲透

【免费下载链接】boxer Code for the Boxer research paper 项目地址: https://gitcode.com/gh_mirrors/boxer13/boxer 点击查看 免费下载 Boxer 是一个将开放世界 2D 检测框"抬升"(lifting)为 3D 方向包围盒(OBB&… · 2026/11/4 16:11:59

REA:本地 AI 逆向工程指南,用 1 条命令看清竞品应用的内部实现
REA:本地 AI 逆向工程指南,用 1 条命令看清竞品应用的内部实现

REA:本地 AI 逆向工程指南,用 1 条命令看清竞品应用的内部实现 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea 你在别人的 … · 2026/11/4 16:11:59

Qt 5.15.0在线安装卡29%:Fiddler镜像改写与分批补装
Qt 5.15.0在线安装卡29%:Fiddler镜像改写与分批补装

简介:《完美解决QT 5.15.0在线安装问题》是一份面向Qt开发者的实战排错文档,聚焦Qt 5.15.0之后官方改为在线安装所引发的下载缓慢、安装程序频繁崩溃、配置镜像代理后仍在中途失败等典型问题。文档从现象出发,梳理数据量大导致的内存耗尽与连… · 2026/11/4 16:58:48

推荐系统召回阶段损失函数设计与优化实践
推荐系统召回阶段损失函数设计与优化实践

1. 召回系统中的损失函数概述 在推荐系统的召回阶段,损失函数的选择直接影响着模型从海量候选集中筛选出相关物品的能力。不同于排序阶段更关注精准的CTR预估,召回模型的核心任务是快速缩小候选范围,因此其损失函数设计需要兼顾效率与效果。 … · 2026/11/4 16:58:48

Linux下Claude Code连接DeepSeek大模型实战指南
Linux下Claude Code连接DeepSeek大模型实战指南

1. Linux 环境下 Claude Code 的安装与配置指南 作为一名长期在 Linux 环境下工作的开发者,我最近深度体验了 Claude Code 这款 AI 编程助手,特别是在连接国内大模型 DeepSeek 方面的实践。本文将分享我在 Ubuntu 22.04 LTS 系统上的完整配置过程&#x… · 2026/11/4 16:58:48

R语言钻石价格回归分析:从数据清洗到交互项与模型评估
R语言钻石价格回归分析:从数据清洗到交互项与模型评估

简介:围绕钻石价格影响因素展开的R语言数据分析实践文档,面向掌握R基础语法、希望打通从数据清洗到回归建模全流程的学习者,可用于课程作业、统计分析入门练习与回归分析案例参考。压缩包共1个文件,为docx格式的完整分析报告&… · 2026/11/4 16:58:48

工业自动化中的动态抓取系统:移动相机与2D匹配技术
工业自动化中的动态抓取系统:移动相机与2D匹配技术

1. 项目概述与核心价值 这个案例展示的是工业自动化领域中最具挑战性的应用场景之一——基于移动相机的动态抓取系统。不同于传统固定相机的视觉引导方案,"眼在手上"(Eye-in-Hand)系统将2D视觉传感器直接集成在机械臂末端&#xff… · 2026/11/4 16:58:48

C++虚函数与虚基类底层机制及性能优化
C++虚函数与虚基类底层机制及性能优化

1. 虚函数与虚基类的本质探索在C面向对象编程中,虚函数和虚基类是实现多态和解决菱形继承问题的核心机制。这两个特性通过虚函数表(vtable)和虚基类表(vbtable)在底层实现,理解它们的运作原理对于深入掌握C… · 2026/11/4 16:57:48

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码