如何通过ajv-errors为JSONForm的嵌套属性配置自定义'required'错误消息
我明白你遇到的问题了——嵌套结构下给required规则加自定义消息确实容易踩坑,尤其是和JSONForm、ajv-errors搭配的时候。你现在的写法其实思路是对的,只是可能差了两个关键细节:AJV实例的初始化配置,或者errorMessage的匹配逻辑。
先给你说最容易忽略的点:AJV实例必须开启allErrors: true,并且正确注册ajv-errors插件。如果没开这个配置,AJV只会返回第一个校验错误,你的自定义required消息可能被其他错误覆盖,甚至根本不会触发。比如你的JS代码里应该这么初始化AJV:
const Ajv = require('ajv'); const ajvErrors = require('ajv-errors'); // 一定要加 allErrors: true,否则ajv-errors的很多自定义消息逻辑不生效 const ajv = new Ajv({ allErrors: true }); // 注册ajv-errors插件 ajvErrors(ajv);
再看你的Schema写法,其实已经很接近正确了,只是可以再微调下确保AJV能正确关联到字段:
{ "type": "object", "properties": { "personal": { "type": "object", "properties": { "name": { "type": "string", "minLength": 2, "maxLength": 50, "errorMessage": { "type": "Name must be a string", "minLength": "Name must have at least 2 characters", "maxLength": "Name cannot exceed 50 characters" } } }, "required": ["name"], // 这个写法完全正确:针对personal对象下的required字段name定义专属消息 "errorMessage": { "required": { "name": "Name is required" } } } } }
为什么之前的写法没生效?大概率是AJV没开allErrors或者没注册插件。ajv-errors严重依赖allErrors选项——没开的话,AJV遇到第一个错误就会停止校验,根本不会走到required消息的触发逻辑。另外,JSONForm会把嵌套字段解析成personal/name这样的路径,而AJV抛出的required错误的实例路径是/personal,但ajv-errors会自动把消息关联到对应的子字段,只要你的Schema层级正确,JSONForm就能把消息精准显示在对应的输入框上。
如果还是有问题,给你个小技巧:可以试试在根级的errorMessage里用路径匹配的方式兜底,不过这种写法不够优雅,还是推荐上面的层级对应写法:
{ "type": "object", "properties": { /* 你的原有属性 */ }, "errorMessage": { "/personal/name": "Name is required" } }
总结一下:先把AJV的allErrors配置开了、插件注册好,再确保errorMessage和required规则在同一个对象层级下,这样就能正常显示自定义的required错误消息了。
内容来源于stack exchange

