You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					319 lines
				
				7.9 KiB
			
		
		
			
		
	
	
					319 lines
				
				7.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								# 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)
							 |