JavaScript对象的对象模式描述语言和验证器。
主要维护者: Nicolas Morel
简介
假设你运行Facebook,并且你希望访问者在真实姓名的网站上注册,而不是在名字字段中输入 l337_p@nda 。您如何定义可输入内容的限制并根据设定的规则验证它?
这是joi,joi允许您为JavaScript对象(存储信息的对象)创建蓝图或模式以确保验证关键信息。
API
请参阅详细的 API参考资料。
示例
const Joi = require('joi'); const 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({ minDomainAtoms: 2 }) }).with('username', 'birthyear').without('password', 'access_token'); // Return result. const result = Joi.validate({ username: 'abc', birthyear: 1994 }, schema); // result.error === null -> valid // You can also pass a callback which will be called synchronously with the validation result. Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { }); // err === null -> valid
以上模式定义了以下约束:
- 用户名
- 必填字符串
- 只能包含字母数字字符
- 至少3个字符,但不超过30个
- 必须附有 birthyear
- 密码
- 可选字符串
- 必须满足自定义正则表达式
- 不能与 access_token 一起出现
- access_token
- 可选的无约束字符串或数字
- birthyear
- 1900年至2013年之间的整数
- 电子邮件
- 有效的电子邮件地址字符串
用法
用法是一个两步骤的过程。首先,使用提供的类型和约束来构造模式:
const schema = { a: Joi.string() };
请注意, joi 模式对象是不可变的,这意味着添加的每个附加规则(例如 .min(5))将返回一个 新的模式对象。
然后,该值将根据模式进行验证:
const {error, value} = Joi.validate({ a: 'a string' }, schema); // or Joi.validate({ a: 'a string' }, schema, function (error, value) { });
如果输入有效,那么错误将是 null ,否则它将是一个Error对象。
模式可以是一个普通的JavaScript对象,其中每个键被分配一个 joi 类型,或者直接可以是一个 joi 类型:
const schema = Joi.string().min(10);
如果模式是 joi 类型,则可以直接在该类型上调用 schema.validate(value,callback)。当传递一个非类型的模式对象时, 该模块将其内部转换为等效的object()类型
const schema = Joi.object().keys({ a: Joi.string() });
验证架构时:
- 默认情况下,值(或对象中的键)是可选的。
Joi.validate(undefined, Joi.string()); // validates fine
要禁止这种行为,您可以将模式设置为 required(),或者将 presence 设置为“required”代码>选项:Joi.validate(undefined, Joi.string().required()); // or Joi.validate(undefined, Joi.string(), /* options */ { presence: "required" });
- 字符串是由defau编码的utf-8
- 规则以添加方式定义,并在白名单和黑名单检查后按顺序进行评估。
浏览器
Joi不直接支持浏览器,但您可以使用 joi-browser 获得Joi的ES5版本在浏览器中,或者作为你自己构建的灵感来源。