9a4746935a2ce04d8ae46938eb067bea10566535a0984932202e22a087e7bc9049608cdd6483d9811f709e9433dc5e4b259a3b68e3aad09c0fd7abd8119c43 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <a href="http://hapijs.com"><img src="https://raw.githubusercontent.com/hapijs/assets/master/images/family.png" width="180px" align="right" /></a>
  2. # joi
  3. Object schema description language and validator for JavaScript objects.
  4. [![Build Status](https://travis-ci.org/hapijs/joi.svg?branch=master)](https://travis-ci.org/hapijs/joi)
  5. ## Introduction
  6. Imagine you run facebook and you want visitors to sign up on the website with real names and not something like `l337_p@nda` in the first name field. How would you define the limitations of what can be inputted and validate it against the set rules?
  7. This is joi, joi allows you to create *blueprints* or *schemas* for JavaScript objects (an object that stores information) to ensure *validation* of key information.
  8. # Installation
  9. ```cli
  10. npm install --save @hapi/joi
  11. ```
  12. ## API
  13. See the detailed [API Reference](https://github.com/hapijs/joi/blob/v15.1.0/API.md).
  14. ## Example
  15. ```javascript
  16. const Joi = require('@hapi/joi');
  17. const schema = Joi.object().keys({
  18. username: Joi.string().alphanum().min(3).max(30).required(),
  19. password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),
  20. access_token: [Joi.string(), Joi.number()],
  21. birthyear: Joi.number().integer().min(1900).max(2013),
  22. email: Joi.string().email({ minDomainSegments: 2 })
  23. }).with('username', 'birthyear').without('password', 'access_token');
  24. // Return result.
  25. const result = Joi.validate({ username: 'abc', birthyear: 1994 }, schema);
  26. // result.error === null -> valid
  27. // You can also pass a callback which will be called synchronously with the validation result.
  28. Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid
  29. ```
  30. The above schema defines the following constraints:
  31. * `username`
  32. * a required string
  33. * must contain only alphanumeric characters
  34. * at least 3 characters long but no more than 30
  35. * must be accompanied by `birthyear`
  36. * `password`
  37. * an optional string
  38. * must satisfy the custom regex
  39. * cannot appear together with `access_token`
  40. * `access_token`
  41. * an optional, unconstrained string or number
  42. * `birthyear`
  43. * an integer between 1900 and 2013
  44. * `email`
  45. * a valid email address string
  46. * must have two domain parts e.g. `example.com`
  47. ## Usage
  48. Usage is a two steps process. First, a schema is constructed using the provided types and constraints:
  49. ```javascript
  50. const schema = {
  51. a: Joi.string()
  52. };
  53. ```
  54. Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a
  55. new schema object.
  56. Second, the value is validated against the defined schema:
  57. ```javascript
  58. const {error, value} = Joi.validate({ a: 'a string' }, schema);
  59. // or
  60. Joi.validate({ a: 'a string' }, schema, function (error, value) { });
  61. ```
  62. If the input is valid, then the `error` will be `null`, otherwise it will be an `Error` object providing more information.
  63. The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:
  64. ```javascript
  65. const schema = Joi.string().min(10);
  66. ```
  67. 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,
  68. the module converts it internally to an object() type equivalent to:
  69. ```javascript
  70. const schema = Joi.object().keys({
  71. a: Joi.string()
  72. });
  73. ```
  74. When validating a schema:
  75. * Values (or keys in case of objects) are optional by default.
  76. ```javascript
  77. Joi.validate(undefined, Joi.string()); // validates fine
  78. ```
  79. To disallow this behavior, you can either set the schema as `required()`, or set `presence` to `"required"` when passing `options`:
  80. ```javascript
  81. Joi.validate(undefined, Joi.string().required());
  82. // or
  83. Joi.validate(undefined, Joi.string(), /* options */ { presence: "required" });
  84. ```
  85. * Strings are utf-8 encoded by default.
  86. * Rules are defined in an additive fashion and evaluated in order, first the inclusive rules, then the exclusive rules.
  87. ## Browsers
  88. Joi doesn't directly support browsers, but you could use [joi-browser](https://github.com/jeffbski/joi-browser) for an ES5 build of Joi that works in browsers, or as a source of inspiration for your own builds.