ajv-errors
自定义 JSON schema 中的错误信息插件。
安装
npm install ajv-errors
1
使用
向 Ajv 实例中添加errorMessage
关键字:
var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true, jsonPointers: true});
// Ajv options allErrors and jsonPointers are required
require('ajv-errors')(ajv /*, {singleError: true} */);
1
2
3
4
2
3
4
单个信息
用一条消息替换当前 schema 和子鸡 schema 中的所有错误:
var schema = {
type: 'object',
required: ['foo'],
properties: {
foo: { type: 'integer' }
},
additionalProperties: false,
errorMessage: 'should be an object with an integer property foo only'
};
var validate = ajv.compile(schema);
console.log(validate({foo: 'a', bar: 2})); // false
console.log(validate.errors); // 处理后的错误信息
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
处理后的错误信息:
[
{
keyword: 'errorMessage',
message: 'should be an object with an integer property foo only',
// ...
params: {
errors: [
{ keyword: 'additionalProperties', dataPath: '' /* , ... */ },
{ keyword: 'type', dataPath: '.foo' /* , ... */ }
]
}
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
关键字信息
仅替换当前 schema 中的某些关键字错误。
var schema = {
type: 'object',
required: ['foo'],
properties: {
foo: { type: 'integer' }
},
additionalProperties: false,
errorMessage: {
type: 'should be an object', // 不会替换属性“foo”的内部“type”错误
required: 'should have property foo',
additionalProperties: 'should not have properties other than foo'
}
};
var validate = ajv.compile(schema);
console.log(validate({foo: 'a', bar: 2})); // false
console.log(validate.errors); // 处理后的错误信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
处理后的错误信息:
[
{
// 原本的错误
keyword: type,
dataPath: '/foo',
// ...
message: 'should be integer'
},
{
// 生成的错误
keyword: 'errorMessage',
message: 'should not have properties other than foo',
// ...
params: {
errors: [
{ keyword: 'additionalProperties' /* , ... */ }
]
},
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
对于关键字required
和dependencies
,可以为不同的属性指定不同的错误信息:
var schema = {
type: 'object',
required: ['foo', 'bar'],
properties: {
foo: { type: 'integer' },
bar: { type: 'string' }
},
errorMessage: {
type: 'should be an object', // 不会替换属性“foo”的内部“type”错误
required: {
foo: 'should have an integer property "foo"',
bar: 'should have a string property "bar"'
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
属性和项的信息
替换属性/项(和更深层次)的错误,不管它们是在 schema 的什么地方创建的:
var schema = {
type: 'object',
required: ['foo', 'bar'],
allOf: [{
properties: {
foo: { type: 'integer', minimum: 2 },
bar: { type: 'string', minLength: 2 }
},
additionalProperties: false
}],
errorMessage: {
properties: {
foo: 'data.foo should be integer >= 2',
bar: 'data.bar should be string with length >= 2'
}
}
};
var validate = ajv.compile(schema);
console.log(validate({foo: 1, bar: 'a'})); // false
console.log(validate.errors); // 处理后的错误信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
处理后的错误信息:
[
{
keyword: 'errorMessage',
message: 'data.foo should be integer >= 2',
dataPath: '/foo',
// ...
params: {
errors: [
{ keyword: 'minimum' /* , ... */ }
]
},
},
{
keyword: 'errorMessage',
message: 'data.bar should be string with length >= 2',
dataPath: '/bar',
// ...
params: {
errors: [
{ keyword: 'minLength' /* , ... */ }
]
},
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
默认信息
当关键字errorMessage
的值为一个对象。您可以指定出现任何未经关键字/属性/项目覆盖的错误时,使用的信息:
var schema = {
type: 'object',
required: ['foo', 'bar'],
allOf: [{
properties: {
foo: { type: 'integer', minimum: 2 },
bar: { type: 'string', minLength: 2 }
},
additionalProperties: false
}],
errorMessage: {
type: 'data should be an object',
properties: {
foo: 'data.foo should be integer >= 2',
bar: 'data.bar should be string with length >= 2'
},
_: 'data should have properties "foo" and "bar" only'
}
};
var validate = ajv.compile(schema);
console.log(validate({})); // false
console.log(validate.errors); // 处理后的错误信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
处理后的错误信息:
[
{
keyword: 'errorMessage',
message: 'data should be an object with properties "foo" and "bar" only',
dataPath: '',
// ...
params: {
errors: [
{ keyword: 'required' /* , ... */ },
{ keyword: 'required' /* , ... */ }
]
},
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
errorMessage
的属性_
中的消息替换了errorMessage
是字符串时将被替换的相同错误。
模板
在errorMessage
关键字中使用的自定义错误消息可以为模板,它们使用JSON指针或JSON相对指针来验证数据。这样的话就会插入值。请参阅相关文档。
插入值的模板语法是${<pointer>}
。
错误消息中的值会转换为字符串:
- 以区分
false
和"false"
等类似情况。 - 以支持结构性的值。
{
"type": "object",
"properties": {
"size": {
"type": "number",
"minimum": 4
}
},
"errorMessage": {
"properties": {
"size": "size should be a number bigger or equal to 4, current value is ${/size}"
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
配置项
默认:
{
keepErrors: false,
singleError: false
}
1
2
3
4
2
3
4
配置项 | 描述 |
---|---|
keepErrors | 保持原来的错误。默认是删除匹配到的错误(它们仍然在生成错误的params.error 属性中)。如果一个错误被匹配并包含在由errorMessage 关键字生成的错误中,那么将具有属性emUsed: true 。 |
singleError | 为errorMessage 关键字中使用的所有关键字创建一个错误(为属性和项定义的错误消息不会合并,因为它们具有不同的数据路径dataPath )。多个错误消息会连接起来:- false(默认值) :创建多个错误,每个错误都有信息。- true 创建单个错误,错误信息通过";" 进行连接。- 非空的字符串:用作连接消息的分隔符。 |