| # 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) |