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")')
])

⚠️ 注意事项:

司马阅
司马阅

国产领先的AI文档分析产品,帮您从繁杂文档中解放出来

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

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

相关专题

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

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

15

2025.11.27

length函数用法
length函数用法

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

918

2023.09.19

promise的用法
promise的用法

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

298

2023.10.12

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

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

396

2023.10.12

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

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

345

2023.06.29

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

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

2074

2023.08.14

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

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

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.09.05

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

热门下载

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

精品课程

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

共32课时 | 3.7万人学习

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

共10课时 | 0.8万人学习

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

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