在前端开发过程中,数据的验证非常重要,尤其在涉及到用户输入和输出的场景下。Hapi 是一个流行的 node.js 框架,它提供的 joi 插件可帮助我们轻松实现数据验证功能。本文将介绍 joi 的基本概念、使用方法及其与 Hapi 框架的结合使用方式。
Joi 的基本概念
Joi 是一种数据验证库,可以用于服务器端和浏览器端,提供了作为 JavaScript 类型系统的工具,可以验证和验证对象的正确性及类型。
与其他验证库不同,joi 采用深入对象的方式,即使用同一 API 验证嵌套对象。此外,它还支持异步验证和自定义验证函数。
joi 包括以下概念:
- schema:描述对象应具有的属性。它定义了对象的特定属性,并可在定义过程中设置自定义验证功能。
- rules:定义每个 schema 属性的验证规则。
- types:内置类型,比如 string、number 等等。在 schema 属性中定义。
下面是一个常见的 joi schema 的例子:
const Joi = require('@hapi/joi'); const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required(), password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), email: Joi.string().email(), birth_year: Joi.number().integer().min(1900).max(2013), }); const { error, value } = schema.validate({ username: 'abc123', birth_year: 1994 });
上面的代码定义了一个包含 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 对数据进行验证:
const Hapi = require('@hapi/hapi'); const Joi = require('@hapi/joi'); const init = async () => { const server = Hapi.server({ port: 3000, host: 'localhost', }); server.route({ method: 'POST', path: '/users', options: { validate: { payload: Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required(), password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), email: Joi.string().email(), birth_year: Joi.number().integer().min(1900).max(2013), }), } }, handler: (request, h) => { return 'success'; } }); await server.start(); console.log('Server running on %s', server.info.uri); }; init();
上方所示,通过将 Joi 校验对象直接配置在路由选项的 validate.payload 中,即可进行数据验证。客户端传递的请求数据与 payload 中的 schema 进行匹配的时候,若存在匹配失败的情况,即表明该请求无法通过 Hapi 框架路由,在这种情况下,Hapi 会给客户端自动设置 response,响应给客户端错误信息。
总结
joi 是一个强大的验证库,它提供简明易懂的 API、深层次的对象验证和内置的自定义验证函数。使用 Hapi 框架时,joi 相对于其他验证库也更适合进行请求和响应验证。
在实际项目中,除了上文所提到的功能,joi 还提供了更多特性,如 i18n 国际化支持等。
希望这篇文章对您学习并理解 Hapi 如何使用 joi 进行数据验证有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a8ced9add4f0e0ff20612c