根据 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 的例子:

----- --- - ---------------------

----- ------ - ------------
  --------- ------------
    -----------
    -------
    --------
    ------------
  --------- ------------------------ -------------------------------
  ------ ---------------------
  ----------- -------------------------------------------
---

----- - ------ ----- - - ----------------- --------- --------- ----------- ---- ---

上面的代码定义了一个包含 username、password、email 和 birth_year 属性的对象 schema。其中,username 必须为包含字母数字、3-30 个字符的字符串;password 必须匹配特定的正则表达式;email 必须是一个电子邮件地址;而 birth_year 必须是一个介于 1900 年至 2013 年之间的整数。

除了设置每个属性的规则,您还可以对所有属性应共享的规则进行定义:例如,可采用 Joi.number().min(0) 规则来定义全局最小数字限制。

Joi 的使用方法

使用 joi 库来验证数据非常容易:通过使用 schema,检测用户输入、JSON 对象、配置、密码等等几乎任何类型的数据都是可行的。

以下是最基本的 joi 使用样例:

----- --- - ---------------------

----- ------ - ------------
  ----- -------------------------------
  ---- ------------------------
---

----- - ------ ----- - - ----------------- ----- ------ ---- -- ---

对于以上 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


猜你喜欢

  • 使用 ES10 的数组.flat 方法优化多维数组的性能

    在前端开发中,我们经常需要处理包含多层嵌套结构的数组。在这类数组中查找和操作元素通常需要耗费大量的时间和资源。为了解决这个问题,ES10 版本中引入了数组.flat 方法,可以让我们更有效地处理多维数...

    9 个月前
  • GraphQL 技术栈之 Apollo:从入门到进阶

    背景 GraphQL 是近年来越来越受欢迎的一种数据查询语言,在前端技术领域已经逐渐取代了传统的 RESTful API。然而,GraphQL 的规范只有一些基本的定义,除此之外我们需要自己去实现其具...

    9 个月前
  • Webpack 中使用和配置 postcss 和 LESS

    在前端开发中,模块化和构建工具已经成为不可或缺的一部分,而 Webpack 作为一个现代化的模块化构建工具,受到越来越多的开发者的青睐。在 Webpack 中,我们可以通过使用 postcss 和 L...

    9 个月前
  • 如何在 Mocha 测试中使用 rewire 和 sinon 来代替需要打桩的模块?

    在前端开发领域中,测试是一个非常重要的环节。我们需要保证代码的质量和稳定性,而测试就是验证这些方面的最好工具。而在测试中有时候我们需要打桩(stub/mock)某些模块,以保证测试的独立性和可靠性。

    9 个月前
  • 详解 ECMAScript 2016 中的结构体和枚举类型

    前言 ECMAScript 是一种基于 JavaScript 的标准化语言,在每年的不断更新中,引入了很多 C++ 和 Java 等语言中常用的特性。其中,ECMAScript 2016 中引入了结构...

    9 个月前
  • 如何使用 ES8 中的 Array.prototype.find() 和 Array.prototype.findIndex() 方法解决 JavaScript 数组遍历问题

    在 JavaScript 中,数组是非常常见的数据结构。在前端开发中,我们经常需要对数组进行遍历操作。而在 ES8 中,出现了两个新的数组方法:Array.prototype.find() 和 Arr...

    9 个月前
  • 解决 TailwindCSS 和 Bootstrap 的兼容性问题

    在前端开发过程中,我们会经常使用到各种前端框架,例如 TailwindCSS 和 Bootstrap。虽然它们都是非常流行和强大的框架,但由于两者的设计理念和技术实现有所不同,使用它们的兼容性问题也就...

    9 个月前
  • 利用 Docker 构建 Java 应用环境和工具

    引言 Docker 可以帮助开发者在不同的操作系统和环境中快速构建、共享和部署应用程序。在 Java 开发中,将应用程序封装在 Docker 容器中可以有效地提高开发效率和交付速度。

    9 个月前
  • Babel-preset-env 的 useBuiltIns 或 preset 中的 useBuiltIns 讲解

    在前端开发中,使用 Babel 来进行代码转换变得越来越常见。Babel 可以将 ES6+ 的新特性转换为 ES5 可以识别的语法。在使用 babel-preset-env 进行转换时,我们可以根据应...

    9 个月前
  • 首次在 async/await 下结合使用 Promise

    前言 在前端开发中,异步操作是一个常见问题。传统的异步操作方式有回调函数和 Promise,而 ES7 中的 async/await 操作则更加方便和简洁。 但是在实际开发中,我们经常需要在 asyn...

    9 个月前
  • 如何在 Chai 中进行链式断言时优雅地处理 null 或 undefined

    如何在 Chai 中进行链式断言时优雅地处理 null 或 undefined 前言 在前端开发中,单元测试是十分重要的一环,而 Chai 是一个常被用来进行单元测试和行为驱动开发(BDD)的断言库,...

    9 个月前
  • Flexbox 布局实现微信小程序组件滑动删除功能

    在微信小程序开发中,实现滑动删除组件是非常常见的需求。本文将介绍如何使用 Flexbox 布局实现微信小程序的滑动删除功能。 什么是 Flexbox 布局? Flexbox 布局(Flexible B...

    9 个月前
  • ES11 中 BigInt 与 Number 类型的混用引发的报错

    简介 BigInt 是 JavaScript 中新增的数据类型,用于表示任意长度整数。ES11 新增 BigInt 类型,允许我们在语言层面上使用非常大的整数,在避免精度问题的同时提供了更多的计算能力...

    9 个月前
  • Kubernetes 中的灰度发布方案设计

    随着互联网应用的不断发展,用户的需求也越来越丰富和多样化。针对用户需求的不断变化和迭代,灰度发布成为了一种非常有用的技术手段。在 Kubernetes 中,如何设计一个灰度发布方案,能够帮助开发者更轻...

    9 个月前
  • 如何构建一个可扩展的 Headless CMS

    在当今互联网时代,内容管理系统(CMS)已经成为了各类网站和应用必不可少的一部分。然而,传统的 CMS 通常会捆绑前端渲染代码,导致前后端无法分离,也无法很好地适应不同的前端代码框架。

    9 个月前
  • MongoDB 中使用 $lookup 进行跨集合查询技巧解析

    MongoDB 中使用 $lookup 进行跨集合查询技巧解析 在 MongoDB 中,$lookup 可以在两个或多个集合之间执行左外连接,非常适合于在多个数据集合之间创建导航结构或创建丰富的查询结...

    9 个月前
  • Koa 和 React 结合的最佳实践

    Koa 是一款流行的 Node.js Web 框架,而 React 则是当前最流行的前端框架之一。结合使用 Koa 和 React 可以构建高效、稳定的 Web 应用。

    9 个月前
  • SASS 中如何使用 @error 输出错误信息

    SASS 中如何使用 @error 输出错误信息 SASS 是一种 CSS 预处理器,它提供了很多便捷的语法和功能,比如嵌套语法、变量、混合器、函数等等。但是在使用 SASS 时,我们常常会出现一些语...

    9 个月前
  • CSS Grid 布局实现响应式个人主页的技巧分享

    随着现代 Web 应用的流行,个人主页成为了展示个人品牌并促进个人成功的重要方式之一。而实现一个吸引人且易于使用的个人主页,响应式布局尤为重要。CSS Grid 布局技术提供了一种强大的、简单易用的方...

    9 个月前
  • Material Design 中如何定制 TabLayout 控件

    Material Design 是谷歌公司推出的一套现代,统一的设计语言,适用于各种类型的界面设计。而 TabLayout 控件是 Material Design 中非常常见的一种控件,通常用于展示一...

    9 个月前

相关推荐

    暂无文章