在前端开发过程中,数据的验证非常重要,尤其在涉及到用户输入和输出的场景下。Hapi 是一个流行的 node.js 框架,它提供的 joi 插件可帮助我们轻松实现数据验证功能。本文将介绍 joi 的基本概念、使用方法及其与 Hapi 框架的结合使用方式。
Joi 的基本概念
Joi 是一种数据验证库,可以用于服务器端和浏览器端,提供了作为 JavaScript 类型系统的工具,可以验证和验证对象的正确性及类型。
与其他验证库不同,joi 采用深入对象的方式,即使用同一 API 验证嵌套对象。此外,它还支持异步验证和自定义验证函数。
joi 包括以下概念:
- schema:描述对象应具有的属性。它定义了对象的特定属性,并可在定义过程中设置自定义验证功能。
- rules:定义每个 schema 属性的验证规则。
- types:内置类型,比如 string、number 等等。在 schema 属性中定义。
下面是一个常见的 joi schema 的例子:
-- -------------------- ---- ------- ----- --- - --------------------- ----- ------ - ------------ --------- ------------ ----------- ------- -------- ------------ --------- ------------------------ ------------------------------- ------ --------------------- ----------- ------------------------------------------- --- ----- - ------ ----- - - ----------------- --------- --------- ----------- ---- ---
上面的代码定义了一个包含 username、password、email 和 birth_year 属性的对象 schema。其中,username 必须为包含字母数字、3-30 个字符的字符串;password 必须匹配特定的正则表达式;email 必须是一个电子邮件地址;而 birth_year 必须是一个介于 1900 年至 2013 年之间的整数。
除了设置每个属性的规则,您还可以对所有属性应共享的规则进行定义:例如,可采用 Joi.number().min(0)
规则来定义全局最小数字限制。
Joi 的使用方法
使用 joi 库来验证数据非常容易:通过使用 schema,检测用户输入、JSON 对象、配置、密码等等几乎任何类型的数据都是可行的。
以下是最基本的 joi 使用样例:
const Joi = require('@hapi/joi'); const schema = Joi.object({ name: Joi.string().min(3).required(), age: Joi.number().required(), }); const { error, value } = schema.validate({ name: 'Abc', age: 25 });
对于以上 code,当解析成功时,value 中包含验证过的值;反之,error 中包含相应的错误信息。error 对象通过 message 字段可以输出提示信息字符串。
除了通用的 validate
方法,joi 还具有以下常用方法:
validateAsync(value, [errback])
:验证值,并异步地返回。describe()
:返回 schema 及其所有关联规则的简运行信息,适用于测试和错误报告。assert(value, [message])
:验证值是否有效,若无效则抛出异常。attempt(value, [message])
:验证值是否有效,无效时抛出异常。compile()
:将 schema 编译成一个可重复使用的对象,使 joi 可以更快速地执行同样的验证。
Joi 与 Hapi 的结合使用
joi 也可用于服务器上的请求和响应验证,尤其对于使用 Hapi 框架时更加有用。
可以使用 Hapi 的插件配置机制进行请求数据验证,Hapi 对 joi 集成得很好,需要做的只是简单地将 schema 配置在路由上,然后 Hapi 立即在收到请求时验证数据。
以下是一个简单的 Hapi 路由示例,使用上面定义的 schema 对数据进行验证:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- --- - --------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ------------ --- -------------- ------- ------- ----- --------- -------- - --------- - -------- ------------ --------- ------------ ----------- ------- -------- ------------ --------- ------------------------ ------------------------------- ------ --------------------- ----------- ------------------------------------------- --- - -- -------- --------- -- -- - ------ ---------- - --- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------
上方所示,通过将 Joi 校验对象直接配置在路由选项的 validate.payload 中,即可进行数据验证。客户端传递的请求数据与 payload 中的 schema 进行匹配的时候,若存在匹配失败的情况,即表明该请求无法通过 Hapi 框架路由,在这种情况下,Hapi 会给客户端自动设置 response,响应给客户端错误信息。
总结
joi 是一个强大的验证库,它提供简明易懂的 API、深层次的对象验证和内置的自定义验证函数。使用 Hapi 框架时,joi 相对于其他验证库也更适合进行请求和响应验证。
在实际项目中,除了上文所提到的功能,joi 还提供了更多特性,如 i18n 国际化支持等。
希望这篇文章对您学习并理解 Hapi 如何使用 joi 进行数据验证有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65a8ced9add4f0e0ff20612c