
Object schema description language and validator for JavaScript objects.
Current version: **4.6.x**
[](http://travis-ci.org/spumko/joi)
[](https://ci.testling.com/spumko/joi)
## Table of Contents
- [Example](#example)
- [Usage](#usage)
- [`validate(value, schema, [options], callback)`](#validatevalue-schema-options-callback)
- [`compile(schema)`](#compileschema)
- [`assert(value, schema)`](#assertvalue-schema)
- [`any`](#any)
- [`any.allow(value)`](#anyallowvalue)
- [`any.valid(value)`](#anyvalidvalue)
- [`any.invalid(value)`](#anyinvalidvalue)
- [`any.required()`](#anyrequired)
- [`any.optional()`](#anyoptional)
- [`any.forbidden()`](#anyforbidden)
- [`any.description(desc)`](#anydescriptiondesc)
- [`any.notes(notes)`](#anynotesnotes)
- [`any.tags(tags)`](#anytagstags)
- [`any.meta(meta)`](#anymetameta)
- [`any.example(value)`](#anyexamplevalue)
- [`any.unit(name)`](#anyunitname)
- [`any.options(options)`](#anyoptionsoptions)
- [`any.strict()`](#anystrict)
- [`any.default(value)`](#anydefaultvalue)
- [`any.concat(schema)`](#anyconcatschema)
- [`any.when(ref, options)`](#anywhenref-options)
- [`array`](#array)
- [`array.includes(type)`](#arrayincludestype)
- [`array.excludes(type)`](#arrayexcludestype)
- [`array.min(limit)`](#arrayminlimit)
- [`array.max(limit)`](#arraymaxlimit)
- [`array.length(limit)`](#arraylengthlimit)
- [`binary`](#binary)
- [`binary.encoding(encoding)`](#binaryencodingencoding)
- [`binary.min(limit)`](#binaryminlimit)
- [`binary.max(limit)`](#binarymaxlimit)
- [`binary.length(limit)`](#binarylengthlimit)
- [`boolean()`](#boolean)
- [`date`](#date)
- [`date.min(date)`](#datemindate)
- [`date.max(date)`](#datemaxdate)
- [`func`](#func)
- [`number`](#number)
- [`number.min(limit)`](#numberminlimit)
- [`number.max(limit)`](#numbermaxlimit)
- [`number.integer()`](#numberinteger)
- [`object`](#object)
- [`object.keys([schema])`](#objectkeysschema)
- [`object.min(limit)`](#objectminlimit)
- [`object.max(limit)`](#objectmaxlimit)
- [`object.length(limit)`](#objectlengthlimit)
- [`object.pattern(regex, schema)`](#objectpatternregex-schema)
- [`object.and(peers)`](#objectandpeers)
- [`object.or(peers)`](#objectorpeers)
- [`object.xor(peers)`](#objectxorpeers)
- [`object.with(key, peers)`](#objectwithkey-peers)
- [`object.without(key, peers)`](#objectwithoutkey-peers)
- [`object.rename(from, to, [options])`](#objectrenamefrom-to-options)
- [`object.assert(ref, schema, message)`](#objectassertref-schema-message)
- [`object.unknown([allow])`](#objectunknownallow)
- [`string`](#string)
- [`string.insensitive()`](#stringinsensitive)
- [`string.min(limit, [encoding])`](#stringminlimit-encoding)
- [`string.max(limit, [encoding])`](#stringmaxlimit-encoding)
- [`string.length(limit, [encoding])`](#stringlengthlimit-encoding)
- [`string.regex(pattern)`](#stringregexpattern)
- [`string.alphanum()`](#stringalphanum)
- [`string.token()`](#stringtoken)
- [`string.email()`](#stringemail)
- [`string.guid()`](#stringguid)
- [`string.isoDate()`](#stringisodate)
- [`string.hostname()`](#stringhostname)
- [`string.lowercase()`](#stringlowercase)
- [`string.uppercase()`](#stringuppercase)
- [`string.trim()`](#stringtrim)
- [`alternatives`](#alternatives)
- [`alternatives.try(schemas)`](#alternativestryschemas)
- [`alternatives.when(ref, options)`](#alternativeswhenref-options)
- [`ref(key, [options])`](#refkey-options)
# Example
```javascript
var Joi = require('joi');
var schema = Joi.object().keys({
username: Joi.string().alphanum().min(3).max(30).required(),
password: Joi.string().regex(/[a-zA-Z0-9]{3,30}/),
access_token: [Joi.string(), Joi.number()],
birthyear: Joi.number().integer().min(1900).max(2013),
email: Joi.string().email()
}).with('username', 'birthyear').without('password', 'access_token');
Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid
```
The above schema defines the following constraints:
* `username`
* a required string
* must contain only alphanumeric characters
* at least 3 characters long but no more than 30
* must be accompanied by `birthyear`
* `password`
* an optional string
* must satisfy the custom regex
* cannot appear together with `access_token`
* `access_token`
* an optional, unconstrained string or number
* `birthyear`
* an integer between 1900 and 2013
* `email`
* a valid email address string
# Usage
Usage is a two steps process. First, a schema is constructed using the provided types and constraints:
```javascript
var schema = {
a: Joi.string()
};
```
Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a
new schema object.
Then the value is validated against the schema:
```javascript
Joi.validate({ a: 'a string' }, schema, function (err, value) { });
```
If the value is valid, `null` is returned, otherwise an `Error` object.
The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:
```javascript
var schema = Joi.string().min(10);
```
If the schema is a **joi** type, the `schema.validate(value, callback)` can be called directly on the type. When passing a non-type schema object,
the module converts it internally to an object() type equivalent to:
```javascript
var schema = Joi.object().keys({
a: Joi.string()
});
```
When validating a schema:
* Keys are optional by default.
* Strings are utf-8 encoded by default.
* Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks.
### `validate(value, schema, [options], callback)`
Validates a value using the given schema and options where:
- `value` - the value being validated.
- `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object.
- `options` - an optional object with the following optional keys:
- `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`.
- `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`.
- `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`.
- `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`.
- `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object). Defaults to `false`.
- `language` - overrides individual error messages. Defaults to no override (`{}`).
- `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to
`validate()` and not using `any.options()`.
- `callback` - the synchronous callback method using the signature `function(err, value)` where:
- `err` - if validation failed, the error reason, otherwise `null`.
- `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be
incomplete if validation failed and `abortEarly` is `true`.
```javascript
var schema = {
a: Joi.number()
};
var value = {
a: '123'
};
Joi.validate(value, schema, function (err, value) { });
// err -> null
// value.a -> 123 (number, not string)
```
### `compile(schema)`
Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where:
- `schema` - the schema definition to compile.
```javascript
var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }];
var schema = Joi.compile(definition);
// Same as:
var schema = Joi.alternatives().try([
Joi.string().valid('key'),
Joi.number().valid(5),
Joi.object().keys({
a: Joi.boolean().valid(true),
b: Joi.alternatives().try([
Joi.string().regex(/^a/),
Joi.string().valid('boom')
])
})
]);
```
### `assert(value, schema)`
Validates a value against a schema and throws if validation fails where:
- `value` - the value to validate.
- `schema` - the schema object.
```javascript
Joi.assert('x', Joi.number());
```
### `any`
Generates a schema object that matches any data type.
```javascript
var any = Joi.any();
any.validate('a', function (err, value) { });
```
#### `any.allow(value)`
Whitelists a value where:
- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.
`value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).
```javascript
var schema = {
a: Joi.any().allow('a'),
b: Joi.any().allow('b', 'B'),
c: Joi.any().allow(['c', 'C'])
};
```
#### `any.valid(value)`
Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where:
- `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules.
`value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).
```javascript
var schema = {
a: Joi.any().valid('a'),
b: Joi.any().valid('b', 'B'),
c: Joi.any().valid(['c', 'C'])
};
```
#### `any.invalid(value)`
Blacklists a value where:
- `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules.
`value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options).
```javascript
var schema = {
a: Joi.any().invalid('a'),
b: Joi.any().invalid('b', 'B'),
c: Joi.any().invalid(['c', 'C'])
};
```
#### `any.required()`
Marks a key as required which will not allow `undefined` as value. All keys are optional by default.
```javascript
var schema = Joi.any().required();
```
#### `any.optional()`
Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default.
```javascript
var schema = Joi.any().optional();
```
#### `any.forbidden()`
Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys.
```javascript
var schema = {
a: Joi.any.forbidden()
};
```
#### `any.description(desc)`
Annotates the key where:
- `desc` - the description string.
```javascript
var schema = Joi.any().description('this key will match anything you give it');
```
#### `any.notes(notes)`
Annotates the key where:
- `notes` - the notes string or array of strings.
```javascript
var schema = Joi.any().notes(['this is special', 'this is important']);
```
#### `any.tags(tags)`
Annotates the key where:
- `tags` - the tag string or array of strings.
```javascript
var schema = Joi.any().tags(['api', 'user']);
```
#### `any.meta(meta)`
Attaches metadata to the key where:
- `meta` - the meta object to attach.
```javascript
var schema = Joi.any().meta({ index: true });
```
#### `any.example(value)`
Annotates the key where:
- `value` - an example value.
If the example fails to pass validation, the function will throw.
```javascript
var schema = Joi.string().min(4).example('abcd');
```
#### `any.unit(name)`
Annotates the key where:
- `name` - the unit name of the value.
```javascript
var schema = Joi.number().unit('milliseconds');
```
#### `any.options(options)`
Overrides the global `validate()` options for the current key and any sub-key where:
- `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#joivalidatevalue-schema-options-callback).
```javascript
var schema = Joi.any().options({ convert: false });
```
#### `any.strict()`
Sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys.
```javascript
var schema = Joi.any().strict();
```
#### `any.default(value)`
Sets a default value if the original value is undefined where:
- `value` - the value. `value` supports [references](#refkey-options).
Note that if `value` is an object, any changes to the object after `default()` is called will change the reference
and any future assignment.
```javascript
var schema = {
username: Joi.string().default('new_user')
};
Joi.validate({}, schema, function (err, value) { });
// value === { username: "new_user" }
```
#### `any.concat(schema)`
Returns a new type that is the result of adding the rules of one type to another where:
- `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`.
```javascript
var a = Joi.string().valid('a');
var b = Joi.string().valid('b');
var ab = a.concat(b);
```
#### `any.when(ref, options)`
Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where:
- `ref` - the key name or [reference](#refkey-options).
- `options` - an object with:
- `is` - the required condition **joi** type.
- `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing.
- `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing.
```javascript
var schema = {
a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }),
b: Joi.any()
};
```
### `array`
Generates a schema object that matches an array data type.
Supports the same methods of the [`any()`](#any) type.
```javascript
var array = Joi.array().includes(Joi.string().valid('a', 'b'));
array.validate(['a', 'b', 'a'], function (err, value) { });
```
#### `array.includes(type)`
List the types allowed for the array values where:
- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.
```javascript
var schema = Joi.array().includes(Joi.string(), Joi.number());
```
#### `array.excludes(type)`
List the types forbidden for the array values where:
- `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments.
```javascript
var schema = Joi.array().excludes(Joi.object());
```
#### `array.min(limit)`
Specifies the minimum number of items in the array where:
- `limit` - the lowest number of array items allowed.
```javascript
var schema = Joi.array().min(2);
```
#### `array.max(limit)`
Specifies the maximum number of items in the array where:
- `limit` - the highest number of array items allowed.
```javascript
var schema = Joi.array().max(10);
```
#### `array.length(limit)`
Specifies the exact number of items in the array where:
- `limit` - the number of array items allowed.
```javascript
var schema = Joi.array().length(5);
```
### `boolean`
Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', and 'no'). Can also be called via `bool()`.
Supports the same methods of the [`any()`](#any) type.
```javascript
var boolean = Joi.boolean();
boolean.validate(true, function (err, value) { });
```
### `binary`
Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers).
Supports the same methods of the [`any()`](#any) type.
```javascript
var schema = Joi.binary();
```
#### `binary.encoding(encoding)`
Sets the string encoding format if a string input is converted to a buffer where:
- `encoding` - the encoding scheme.
```javascript
var schema = Joi.binary().encoding('base64');
```
#### `binary.min(limit)`
Specifies the minimum length of the buffer where:
- `limit` - the lowest size of the buffer.
```javascript
var schema = Joi.binary().min(2);
```
#### `binary.max(limit)`
Specifies the maximum length of the buffer where:
- `limit` - the highest size of the buffer.
```javascript
var schema = Joi.binary().max(10);
```
#### `binary.length(limit)`
Specifies the exact length of the buffer:
- `limit` - the size of buffer allowed.
```javascript
var schema = Joi.binary().length(5);
```
### `date`
Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds).
Supports the same methods of the [`any()`](#any) type.
```javascript
var date = Joi.date();
date.validate('12-21-2012', function (err, value) { });
```
#### `date.min(date)`
Specifies the oldest date allowed where:
- `date` - the oldest date allowed.
```javascript
var schema = Joi.date().min('1-1-1974');
```
#### `date.max(date)`
Specifies the latest date allowed where:
- `date` - the latest date allowed.
```javascript
var schema = Joi.date().max('12-31-2020');
```
### `func`
Generates a schema object that matches a function type.
Supports the same methods of the [`any()`](#any) type.
```javascript
var func = Joi.func();
func.validate(function () {}, function (err, value) { });
```
### `number`
Generates a schema object that matches a number data type (as well as strings that can be converted to numbers).
Supports the same methods of the [`any()`](#any) type.
```javascript
var number = Joi.number();
number.validate(5, function (err, value) { });
```
#### `number.min(limit)`
Specifies the minimum value where:
- `limit` - the minimum value allowed.
```javascript
var schema = Joi.number().min(2);
```
#### `number.max(limit)`
Specifies the maximum value where:
- `limit` - the maximum value allowed.
```javascript
var schema = Joi.number().max(10);
```
#### `number.integer()`
Requires the number to be an integer (no floating point).
```javascript
var schema = Joi.number().integer();
```
### `object`
Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults
to allowing any child key.
Supports the same methods of the [`any()`](#any) type.
```javascript
var object = Joi.object().keys({
a: Joi.number().min(1).max(10).integer(),
b: 'some string'
});
object.validate({ a: 5 }, function (err, value) { });
```
#### `object.keys([schema])`
Sets the allowed object keys where:
- `schema` - optional object where each key is assinged a **joi** type object. If `schema` is `{}` no keys allowed.
If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any
previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which
allows any child key.
```javascript
var object = Joi.object().keys({
a: Joi.number()
b: Joi.string()
});
```
#### `object.min(limit)`
Specifies the minimum number of keys in the object where:
- `limit` - the lowest number of keys allowed.
```javascript
var schema = Joi.object().min(2);
```
#### `object.max(limit)`
Specifies the maximum number of keys in the object where:
- `limit` - the highest number of object keys allowed.
```javascript
var schema = Joi.object().max(10);
```
#### `object.length(limit)`
Specifies the exact number of keys in the object where:
- `limit` - the number of object keys allowed.
```javascript
var schema = Joi.object().length(5);
```
#### `object.pattern(regex, schema)`
Specify validation rules for unknown keys matching a pattern where:
- `regex` - a regular expression tested against the unknown key names.
- `schema` - the schema object matching keys much validate against.
```javascrip
var schema = Joi.object({
a: Joi.string()
}).pattern(/\w\d/, Joi.boolean());
```
#### `object.and(peers)`
Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as
well where:
- `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an
array of string values, or each peer provided as an argument.
```javascript
var schema = Joi.object().keys({
a: Joi.any(),
b: Joi.any()
}).and('a', 'b');
```
#### `object.or(peers)`
Defines a relationship between keys where one of the peers is required (and more than one is allowed) where:
- `peers` - the key names of which at least one must appear. `peers` can be a single string value, an
array of string values, or each peer provided as an argument.
```javascript
var schema = Joi.object().keys({
a: Joi.any(),
b: Joi.any()
}).or('a', 'b');
```
#### `object.xor(peers)`
Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where:
- `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an
array of string values, or each peer provided as an argument.
```javascript
var schema = Joi.object().keys({
a: Joi.any(),
b: Joi.any()
}).xor('a', 'b');
```
#### `object.with(key, peers)`
Requires the presence of other keys whenever the specified key is present where:
- `key` - the reference key.
- `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values.
Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not
between the `peers` themselves.
```javascript
var schema = Joi.object().keys({
a: Joi.any(),
b: Joi.any()
}).with('a', 'b');
```
#### `object.without(key, peers)`
Forbids the presence of other keys whenever the specified is present where:
- `key` - the reference key.
- `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values.
```javascript
var schema = Joi.object().keys({
a: Joi.any(),
b: Joi.any()
}).without('a', ['b']);
```
#### `object.rename(from, to, [options])`
Renames a key to another name (deletes the renamed key) where:
- `from` - the original key name.
- `to` - the new key name.
- `options` - an optional object with the following optional keys:
- `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`.
- `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`.
- `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`.
Keys are renamed before any other validation rules are applied.
```javascript
var object = Joi.object().keys({
a: Joi.number()
}).rename('b', 'a');
object.validate({ b: 5 }, function (err, value) { });
```
#### `object.assert(ref, schema, message)`
Verifies an assertion where:
- `ref` - the key name or [reference](#refkey-options).
- `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against
the object value, not the value of the `ref` target.
- `message` - human-readable message used when the assertion fails.
```javascript
var schema = Joi.object().keys({
a: {
b: Joi.string(),
c: Joi.number()
},
d: {
e: Joi.any()
}
}).assert('d.e', Joi.ref('a.c'), 'equal to a.c');
```
#### `object.unknown([allow])`
Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where:
- `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored.
```javascript
var schema = Joi.Object({ a: Joi.any() }).unknown();
```
### `string`
Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`.
Supports the same methods of the [`any()`](#any) type.
```javascript
var schema = Joi.string().min(1).max(10);
schema.validate('12345', function (err, value) { });
```
#### `string.insensitive()`
Allows the value to match any whitelist of blacklist item in a case insensitive comparison.
```javascript
var schema = Joi.string().valid('a').insensitive();
```
#### `string.min(limit, [encoding])`
Specifies the minimum number string characters where:
- `limit` - the minimum number of string characters required.
- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.
```javascript
var schema = Joi.string().min(2);
```
#### `string.max(limit, [encoding])`
Specifies the maximum number of string characters where:
- `limit` - the maximum number of string characters allowed.
- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.
```javascript
var schema = Joi.string().max(10);
```
#### `string.length(limit, [encoding])`
Specifies the exact string length required where:
- `limit` - the required string length.
- `encoding` - is specified, the string length is calculated in bytes using the provided encoding.
```javascript
var schema = Joi.string().length(5);
```
#### `string.regex(pattern)`
Defines a regular expression rule where:
- `pattern` - a regular expression object the string value must match against.
```javascript
var schema = Joi.string().regex(/^[abc]+$/);
```
#### `string.alphanum()`
Requires the string value to only contain a-z, A-Z, and 0-9.
```javascript
var schema = Joi.string().alphanum();
```
#### `string.token()`
Requires the string value to only contain a-z, A-Z, 0-9, and underscore _.
```javascript
var schema = Joi.string().token();
```
#### `string.email()`
Requires the string value to be a valid email address.
```javascript
var schema = Joi.string().email();
```
#### `string.guid()`
Requires the string value to be a valid GUID.
```javascript
var schema = Joi.string().guid();
```
#### `string.isoDate()`
Requires the string value to be in valid ISO 8601 date format.
```javascript
var schema = Joi.string().isoDate();
```
#### `string.hostname()`
Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123).
```javascript
var schema = Joi.string().hostname();
```
#### `string.lowercase()`
Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string
will be forced to lowercase.
```javascript
var schema = Joi.string().lowercase();
```
#### `string.uppercase()`
Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string
will be forced to uppercase.
```javascript
var schema = Joi.string().uppercase();
```
#### `string.trim()`
Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by
default), the string will be trimmed.
```javascript
var schema = Joi.string().trim();
```
### `alternatives`
Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas)
method. If no schemas are added, the type will not match any value except for `undefined`.
Supports the same methods of the [`any()`](#any) type.
Alternatives can be expressed using the shorter `[]` notation.
```javascript
var alt = Joi.alternatives().try(Joi.number(), Joi.string());
// Same as [Joi.number(), Joi.string()]
```
#### `alternatives.try(schemas)``
Adds an alternative schema type for attempting to match against the validated value where:
- `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument.
```javascript
var alt = Joi.alternatives().try(Joi.number(), Joi.string());
alt.validate('a', function (err, value) { });
```
#### `alternatives.when(ref, options)`
Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where:
- `ref` - the key name or [reference](#refkey-options).
- `options` - an object with:
- `is` - the required condition **joi** type.
- `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing.
- `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing.
```javascript
var schema = {
a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }),
b: Joi.any()
};
```
Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting
a `required()` rule on a single alternative will not apply to the overall key. For example,
this definition of `a`:
```javascript
var schema = {
a: Joi.alternatives().when('b', { is: true, then: Joi.required() }),
b: Joi.boolean()
};
```
Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the
value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule
does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])`
when `b` is `true` which will allow any value including `undefined`.
To accomplish the desired result above use:
```javascript
var schema = {
a: Joi.when('b', { is: true, then: Joi.required() }),
b: Joi.boolean()
};
```
### `ref(key, [options])`
Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency
so that if one key validation depends on another, the dependent key is validated second after the reference is validated.
References support the following arguments:
- `key` - the reference target. References cannot point up the object tree, only to siebling keys, but they can point to
their siebling's children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference
which is looked up in the `context` option object.
- `options` - optional settings:
- `separator` - overrides the default `.` hierarchy separator.
- `contextPrefix` - overrides the default `$` context prefix signifier.
Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards
(parents) references are needed, use [`object.assert()`](#objectassertref-schema-message).
```javascript
var schema = Joi.object().keys({
a: Joi.ref('b.c'),
b: {
c: Joi.any()
},
c: Joi.ref('$x')
});
Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {});
```