Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

3 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. ![joi Logo](https://raw.github.com/hapijs/joi/master/images/joi.png)
  2. Object schema description language and validator for JavaScript objects.
  3. [![npm version](https://badge.fury.io/js/joi.svg)](http://badge.fury.io/js/joi)
  4. [![Build Status](https://secure.travis-ci.org/hapijs/joi.svg?branch=master)](http://travis-ci.org/hapijs/joi)
  5. <!--
  6. Remove those badges until they work properly on semver.
  7. [![Dependencies Status](https://david-dm.org/hapijs/joi.svg)](https://david-dm.org/hapijs/joi)
  8. [![DevDependencies Status](https://david-dm.org/hapijs/joi/dev-status.svg)](https://david-dm.org/hapijs/joi#info=devDependencies)
  9. -->
  10. [![NSP Status](https://nodesecurity.io/orgs/hapijs/projects/0394bf83-b5bc-410b-878c-e8cf1b92033e/badge)](https://nodesecurity.io/orgs/hapijs/projects/0394bf83-b5bc-410b-878c-e8cf1b92033e)
  11. [![Known Vulnerabilities](https://snyk.io/test/github/hapijs/joi/badge.svg)](https://snyk.io/test/github/hapijs/joi)
  12. [![Join the chat at https://gitter.im/hapijs/joi](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/hapijs/joi?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
  13. Lead Maintainer: [Nicolas Morel](https://github.com/marsup)
  14. # Introduction
  15. 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?
  16. 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.
  17. # API
  18. See the detailed [API Reference](https://github.com/hapijs/joi/blob/v11.4.0/API.md).
  19. # Example
  20. ```javascript
  21. const Joi = require('joi');
  22. const schema = Joi.object().keys({
  23. username: Joi.string().alphanum().min(3).max(30).required(),
  24. password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),
  25. access_token: [Joi.string(), Joi.number()],
  26. birthyear: Joi.number().integer().min(1900).max(2013),
  27. email: Joi.string().email()
  28. }).with('username', 'birthyear').without('password', 'access_token');
  29. // Return result.
  30. const result = Joi.validate({ username: 'abc', birthyear: 1994 }, schema);
  31. // result.error === null -> valid
  32. // You can also pass a callback which will be called synchronously with the validation result.
  33. Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid
  34. ```
  35. The above schema defines the following constraints:
  36. * `username`
  37. * a required string
  38. * must contain only alphanumeric characters
  39. * at least 3 characters long but no more than 30
  40. * must be accompanied by `birthyear`
  41. * `password`
  42. * an optional string
  43. * must satisfy the custom regex
  44. * cannot appear together with `access_token`
  45. * `access_token`
  46. * an optional, unconstrained string or number
  47. * `birthyear`
  48. * an integer between 1900 and 2013
  49. * `email`
  50. * a valid email address string
  51. # Usage
  52. Usage is a two steps process. First, a schema is constructed using the provided types and constraints:
  53. ```javascript
  54. const schema = {
  55. a: Joi.string()
  56. };
  57. ```
  58. Note that **joi** schema objects are immutable which means every additional rule added (e.g. `.min(5)`) will return a
  59. new schema object.
  60. Then the value is validated against the schema:
  61. ```javascript
  62. const {error, value} = Joi.validate({ a: 'a string' }, schema);
  63. // or
  64. Joi.validate({ a: 'a string' }, schema, function (err, value) { });
  65. ```
  66. If the input is valid, then the error will be `null`, otherwise it will be an Error object.
  67. The schema can be a plain JavaScript object where every key is assigned a **joi** type, or it can be a **joi** type directly:
  68. ```javascript
  69. const schema = Joi.string().min(10);
  70. ```
  71. 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,
  72. the module converts it internally to an object() type equivalent to:
  73. ```javascript
  74. const schema = Joi.object().keys({
  75. a: Joi.string()
  76. });
  77. ```
  78. When validating a schema:
  79. * Values (or keys in case of objects) are optional by default.
  80. ```javascript
  81. Joi.validate(undefined, Joi.string()); // validates fine
  82. ```
  83. To disallow this behavior, you can either set the schema as `required()`, or set `presence` to `"required"` when passing `options`:
  84. ```javascript
  85. Joi.validate(undefined, Joi.string().required());
  86. // or
  87. Joi.validate(undefined, Joi.string(), /* options */ { presence: "required" });
  88. ```
  89. * Strings are utf-8 encoded by default.
  90. * Rules are defined in an additive fashion and evaluated in order after whitelist and blacklist checks.
  91. # Browsers
  92. 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.