0

0

如何让 ExpressValidator 同时校验空数组或非空数组中的每个元素

碧海醫心

碧海醫心

发布时间:2026-01-15 10:38:29

|

201人浏览过

|

来源于php中文网

原创

如何让 ExpressValidator 同时校验空数组或非空数组中的每个元素

expressvalidator 可通过 `oneof` 组合规则,实现对数组字段的“空数组合法、非空时逐项校验”的双重逻辑,避免误判空数组为非法输入。

在 Express 应用中,常需校验一个数组字段(如 animals):它既可以是空数组 [](业务上完全合法),也可以是非空数组(此时要求每个元素都满足自定义校验逻辑,例如 checkAnimal)。但若仅使用 body('animals.*').custom(checkAnimal),ExpressValidator 会跳过空数组——因为 * 通配符不匹配任何元素,导致校验被跳过,无法主动接受空数组;而若只加 isArray(),又无法约束非空时的元素合法性。

正确解法是利用 oneOf 实现“逻辑或”语义:只要满足任一条件即通过校验。以下是推荐写法:

const { body, oneOf } = require('express-validator');

// ✅ 正确:空数组合法 + 非空时逐项校验
oneOf([
  // 条件1:数组存在且为空
  body('animals')
    .isArray()
    .withMessage('animals must be an array')
    .bail() // 防止后续规则执行(可选但推荐)
    .custom((value) => value.length === 0)
    .withMessage('animals array is empty — allowed'),

  // 条件2:数组存在、非空,且每个元素通过 checkAnimal 校验
  body('animals')
    .isArray({ min: 1 })
    .withMessage('animals must be a non-empty array'),
  body('animals.*').custom(checkAnimal)
    .withMessage('Each animal must be valid (e.g., "goat", "lemming", "ocelot")')
])

⚠️ 注意事项:

TTSMaker
TTSMaker

TTSMaker是一个免费的文本转语音工具,提供语音生成服务,支持多种语言。

下载
  • oneOf 内部的每条规则是独立验证链,因此需将 isArray() 和 .custom(...) 分开写在不同分支中(如示例所示),而非混在同一链里;
  • 使用 .bail() 可提前终止当前分支校验,提升性能并避免冗余错误信息;
  • body('animals.*') 在空数组下不触发,所以必须显式校验 length === 0 或用 isArray({ min: 0 }) 配合分支逻辑;
  • 若 checkAnimal 是异步函数(如查数据库),请确保其返回 Promise 并在 custom() 中正确 await。

总结:oneOf 是处理“多态输入语义”的关键工具。面对“空数组 or 元素合规”的需求,不要试图用单条规则覆盖全部场景,而应拆解为互斥且完备的校验分支,兼顾健壮性与可读性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

422

2026.02.10

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

337

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

428

2023.10.12

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

386

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2111

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号