Spaces:
Sleeping
Sleeping
# ajv-errors | |
Custom error messages in JSON-Schema for Ajv validator | |
[](https://travis-ci.org/epoberezkin/ajv-errors) | |
[](http://badge.fury.io/js/ajv-errors) | |
[](https://coveralls.io/github/epoberezkin/ajv-errors?branch=master) | |
[](https://gitter.im/ajv-validator/ajv) | |
## Contents | |
- [Install](#install) | |
- [Usage](#usage) | |
- [Single message](#single-message) | |
- [Messages for keywords](#messages-for-keywords) | |
- [Messages for properties and items](#messages-for-properties-and-items) | |
- [Default message](#default-message) | |
- [Templates](#templates) | |
- [Options](#options) | |
- [License](#license) | |
## Install | |
``` | |
npm install ajv-errors | |
``` | |
## Usage | |
Add the keyword `errorMessages` to Ajv instance: | |
```javascript | |
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} */); | |
``` | |
See [Options](#options) below. | |
### Single message | |
Replace all errors in the current schema and subschemas with a single message: | |
```javascript | |
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); // processed errors | |
``` | |
Processed errors: | |
```javascript | |
[ | |
{ | |
keyword: 'errorMessage', | |
message: 'should be an object with an integer property foo only', | |
// ... | |
params: { | |
errors: [ | |
{ keyword: 'additionalProperties', dataPath: '' /* , ... */ }, | |
{ keyword: 'type', dataPath: '.foo' /* , ... */ } | |
] | |
} | |
} | |
] | |
``` | |
### Messages for keywords | |
Replace errors for certain keywords in the current schema only: | |
```javascript | |
var schema = { | |
type: 'object', | |
required: ['foo'], | |
properties: { | |
foo: { type: 'integer' } | |
}, | |
additionalProperties: false, | |
errorMessage: { | |
type: 'should be an object', // will not replace internal "type" error for the property "foo" | |
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); // processed errors | |
``` | |
Processed errors: | |
```javascript | |
[ | |
{ | |
// original error | |
keyword: type, | |
dataPath: '/foo', | |
// ... | |
message: 'should be integer' | |
}, | |
{ | |
// generated error | |
keyword: 'errorMessage', | |
message: 'should not have properties other than foo', | |
// ... | |
params: { | |
errors: [ | |
{ keyword: 'additionalProperties' /* , ... */ } | |
] | |
}, | |
} | |
] | |
``` | |
For keywords "required" and "dependencies" it is possible to specify different messages for different properties: | |
```javascript | |
var schema = { | |
type: 'object', | |
required: ['foo', 'bar'], | |
properties: { | |
foo: { type: 'integer' }, | |
bar: { type: 'string' } | |
}, | |
errorMessage: { | |
type: 'should be an object', // will not replace internal "type" error for the property "foo" | |
required: { | |
foo: 'should have an integer property "foo"', | |
bar: 'should have a string property "bar"' | |
} | |
} | |
}; | |
``` | |
### Messages for properties and items | |
Replace errors for properties / items (and deeper), regardless where in schema they were created: | |
```javascript | |
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); // processed errors | |
``` | |
Processed errors: | |
```javascript | |
[ | |
{ | |
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' /* , ... */ } | |
] | |
}, | |
} | |
] | |
``` | |
### Default message | |
When the value of keyword `errorMessage` is an object you can specify a message that will be used if any error appears that is not specified by keywords/properties/items: | |
```javascript | |
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); // processed errors | |
``` | |
Processed errors: | |
```javascript | |
[ | |
{ | |
keyword: 'errorMessage', | |
message: 'data should be an object with properties "foo" and "bar" only', | |
dataPath: '', | |
// ... | |
params: { | |
errors: [ | |
{ keyword: 'required' /* , ... */ }, | |
{ keyword: 'required' /* , ... */ } | |
] | |
}, | |
} | |
] | |
``` | |
The message in property `_` of `errorMessage` replaces the same errors that would have been replaced if `errorMessage` were a string. | |
## Templates | |
Custom error messages used in `errorMessage` keyword can be templates using [JSON-pointers](https://tools.ietf.org/html/rfc6901) or [relative JSON-pointers](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00) to data being validated, in which case the value will be interpolated. Also see [examples](https://gist.github.com/geraintluff/5911303) of relative JSON-pointers. | |
The syntax to interpolate a value is `${<pointer>}`. | |
The values used in messages will be JSON-stringified: | |
- to differentiate between `false` and `"false"`, etc. | |
- to support structured values. | |
Example: | |
```json | |
{ | |
"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}" | |
} | |
} | |
} | |
``` | |
## Options | |
Defaults: | |
```javascript | |
{ | |
keepErrors: false, | |
singleError: false | |
} | |
``` | |
- _keepErrors_: keep original errors. Default is to remove matched errors (they will still be available in `params.errors` property of generated error). If an error was matched and included in the error generated by `errorMessage` keyword it will have property `emUsed: true`. | |
- _singleError_: create one error for all keywords used in `errorMessage` keyword (error messages defined for properties and items are not merged because they have different dataPaths). Multiple error messages are concatenated. Option values: | |
- `false` (default): create multiple errors, one for each message | |
- `true`: create single error, messages are concatenated using `"; "` | |
- non-empty string: this string is used as a separator to concatenate messages | |
## Supporters | |
[<img src="https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAAwEAAAAJDg1YzBlYzFjLTA3YWYtNGEzOS1iMTdjLTQ0MTU1NWZjOGM0ZQ.jpg" width="48" height="48">](https://www.linkedin.com/in/rogerkepler/) [Roger Kepler](https://www.linkedin.com/in/rogerkepler/) | |
## License | |
[MIT](https://github.com/epoberezkin/ajv-errors/blob/master/LICENSE) | |