根据 Hapi 框架提供的插件 joi,验证功能如何实现

在前端开发过程中,数据的验证非常重要,尤其在涉及到用户输入和输出的场景下。Hapi 是一个流行的 node.js 框架,它提供的 joi 插件可帮助我们轻松实现数据验证功能。本文将介绍 joi 的基本概念、使用方法及其与 Hapi 框架的结合使用方式。

Joi 的基本概念

Joi 是一种数据验证库,可以用于服务器端和浏览器端,提供了作为 JavaScript 类型系统的工具,可以验证和验证对象的正确性及类型。

与其他验证库不同,joi 采用深入对象的方式,即使用同一 API 验证嵌套对象。此外,它还支持异步验证和自定义验证函数。

joi 包括以下概念:

  1. schema:描述对象应具有的属性。它定义了对象的特定属性,并可在定义过程中设置自定义验证功能。
  2. rules:定义每个 schema 属性的验证规则。
  3. 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


纠错反馈