如何复用 Joi Schema 的属性定义而不继承验证规则

陌枫姑娘_6906

陌枫姑娘_6906

2026-01-05

420人浏览

原创

如何复用 Joi Schema 的属性定义而不继承验证规则

本文介绍在 joi 中如何安全复用基础 schema 的字段定义,避免意外继承 `.xor()`、`.messages()` 等链式配置,通过 `object.keys()` 方法实现纯净的属性扩展。

Joi 的 Schema 实例是不可变(immutable)的,每次调用 .xor()、.messages()、.requiredKeys() 等方法都会返回一个全新 Schema 实例,而非修改原对象。这意味着:直接对已配置 .xor() 和 .messages() 的 Schema 调用 .keys() 或 .append(),不会污染原始定义,但若你从一个“已增强”的 Schema 出发(如 baseSchema.xor(...).messages(...)),再调用 .keys(),新 Schema 仍会携带之前所有规则 —— 这正是问题根源。

✅ 正确做法是:仅对“纯净”的基础 Schema(即仅含 .object({ ... }) 定义、未附加任何校验逻辑或消息)调用 .keys()

以下为推荐实践:

应用程序在线商店宣传网站模板
应用程序在线商店宣传网站模板

应用程序在线商店宣传网站模板是一款提供免费应用程序在线商店宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载
const Joi = require('@hapi/joi'); // 或 @joi/browser(v17+)

// ✅ 第一步:定义纯净的基础字段结构(无 xor / messages)
const baseFields = Joi.object({
  a: Joi.string().trim().empty(null, ''),
  b: Joi.string().guid().empty(null),
});

// ✅ 第二步:基于 baseFields 构建不同用途的完整 Schema
const firstSchema = baseFields
  .xor('a', 'b')
  .messages({
    'object.missing': 'One of "a", "b" is required.',
    'object.xor': 'Only one of "a", "b" is allowed.',
  });

const extendedSchema = baseFields.keys({
  c: Joi.string().trim(),
});

const secondSchema = extendedSchema
  .xor('a', 'b', 'c')
  .messages({
    'object.missing': 'One of "a", "b", "c" is required.',
    'object.xor': 'Only one of "a", "b", "c" is allowed.',
  });

⚠️ 注意事项:

  • ❌ 避免 const baseSchema = Joi.object({...}).xor(...).messages(...); const reused = baseSchema.keys({...}); —— 此时 reused 仍含 xor 和 messages;
  • ✅ baseFields 必须是 纯 Joi.object() 实例,不带任何链式修饰;
  • .keys() 是浅合并:若传入同名键(如 a),会完全覆盖原定义;如需条件性扩展,可先用 .describe() 提取结构,或借助 Joi.compile() 动态构建;
  • Joi v17+ 中 .keys() 已取代旧版 .add(),语义更清晰,推荐统一使用。

总结:Joi 的复用核心在于分层设计——将字段声明(schema structure)与业务规则(validation logic + messages)解耦。baseFields 扮演「类型契约」角色,而各 .xor() + .messages() 组合则作为面向具体场景的「验证策略」。这种模式不仅提升可维护性,也天然支持单元测试中对字段定义的独立断言。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

1878

7

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

2023.10.25

578

4

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

2023.11.14

1476

8

python中append的含义
python中append的含义

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

2025.09.12

1904

8

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

20

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

180

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

80

23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习