如何在Ajv v6中通过ajv-errors为嵌套属性定义自定义错误消息?
Ajv 6 + ajv-errors 嵌套属性自定义错误消息解决方案
你的代码无法生效的核心原因是:Ajv 6版本的ajv-errors不支持在顶层errorMessage的properties字段中直接使用foo.bar这种点分隔的嵌套属性路径,需要按照schema的层级结构嵌套定义,或在子属性的schema中直接配置,或使用JSON指针格式。
以下是三种可行的解决方法:
方法一:在嵌套属性的schema中直接定义错误消息
这是最直观的方式,直接在目标属性的校验规则里添加errorMessage:
var Ajv = require('ajv'/*@6.11.0*/); var ajv = new Ajv({allErrors: true, jsonPointers: true}); require('ajv-errors/*@1.0.1*/')(ajv); var schema = { type: 'object', properties: { foo: { type: 'object', properties: { bar: { type: 'string', minLength: 2, errorMessage: 'foo.bar 必须是长度≥2的字符串' // 直接在子属性schema中定义 } } } } }; var validate = ajv.compile(schema); console.log(validate({foo: { bar: '' }})); // false console.log(validate.errors); // 输出错误消息:foo.bar 必须是长度≥2的字符串
方法二:在顶层errorMessage中嵌套对应schema层级
按照原schema的properties嵌套结构,在errorMessage中同步嵌套定义:
var Ajv = require('ajv'/*@6.11.0*/); var ajv = new Ajv({allErrors: true, jsonPointers: true}); require('ajv-errors/*@1.0.1*/')(ajv); var schema = { type: 'object', properties: { foo: { type: 'object', properties: { bar: { type: 'string', minLength: 2 } } } }, errorMessage: { properties: { foo: { properties: { bar: 'foo.bar 必须是长度≥2的字符串' // 嵌套对应foo→bar的层级 } } } } }; var validate = ajv.compile(schema); console.log(validate({foo: { bar: '' }})); // false console.log(validate.errors);
方法三:使用JSON指针路径
利用你已经开启的jsonPointers配置,使用/foo/bar格式的JSON指针作为键定义错误消息:
var Ajv = require('ajv'/*@6.11.0*/); var ajv = new Ajv({allErrors: true, jsonPointers: true}); require('ajv-errors/*@1.0.1*/')(ajv); var schema = { type: 'object', properties: { foo: { type: 'object', properties: { bar: { type: 'string', minLength: 2 } } } }, errorMessage: { '/foo/bar': 'foo.bar 必须是长度≥2的字符串' // JSON指针路径 } }; var validate = ajv.compile(schema); console.log(validate({foo: { bar: '' }})); // false console.log(validate.errors);
内容的提问来源于stack exchange,提问作者mozenge
相关产品推荐
相关产品推荐

