探究 Hapi.js 实现 API 参数校验的正确姿势

在进行 Web 开发时,参数校验是不可避免的一环。而针对 Node.js 平台,Hapi.js 是一款优秀的服务器框架,具备完整的路由体系以及出色的插件系统,为开发者提供了全方位的解决方案。Hapi.js 提供了丰富的输入校验机制,能够帮助开发者有效地保障 API 的数据完整性和安全性。

API 参数校验的重要性

API 的参数校验是保障内部数据一致性和保证 API 安全性的关键步骤。有效的参数校验可以:

  • 阻止恶意注入攻击
  • 防止无效数据的提交
  • 确保数据类型和长度一致

参数校验的好处不止于此,良好的参数校验方式还可以减少代码的冗余以及提高开发效率。因此,对于 API 开发来说,实现恰当的参数校验方案显得尤为重要。

Hapi.js 的数据校验机制

Hapi.js 提供了 Joi 插件,能够帮助开发者实现数据输入的验证,其自身特性包括:

  • 支持自定义校验规则
  • 提供多种数据类型校验
  • 支持嵌套结构验证
  • 能够自动生成错误提示信息

因此,利用 Joi 进行 Hapi.js 接口开发的数据校验方案通常会表现出许多良好的特性。

实现 Hapi.js 数据校验的正确姿势

接下来将利用多个示例说明如何在 Hapi.js 中实现高效的数据校验方案。

基础参数校验

对于单个的参数校验,可以借助 Joi 的 string() 方法对接受的字符串进行验证。如下所示:

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

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

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

在上述代码中,我们定义了两个 Joi 对象,分别是 paramsquery,并分别指定了欲进行的校验规则,即只允许传递 idname 才能正常运行。

复杂类型参数校验

类似地,我们还可以轻松地实现更复杂的输入数据校验。例如,我们可以使用 Joi 的 array().items() 方法和 number() 方法来实现对数组和数字的数据校验:

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

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

在上述代码中,我们定义了一个名为 items 的数组,并指定其项为包含 idname 两个必须的属性,且 id 必须为数字类型。

贴合业务需求的数据校验

除了上述的基本数据类型校验之外,我们还可以针对特定业务需求进行数据校验。

在下面的代码示例中,我们基于教育领域的相关业务,为一份教育资源的发布和更新的接口进行了相关的数据校验:

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

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

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

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

在上述代码中,我们指定了 titledescription 两个属性为必需且字符长度为 100 和 1000,type 为必传选择项(来源于 valid() 方法的选项),并支持字符串类型的 author 与必传且字符串类型 publisher,以及可选的 tags 字符串字段。

优化自动化的数据校验

针对于常规的 API 接口,我们常常会根据一些相似的结构定义多个 Joi 对象来进行输入参数的验证。而在这种情况下,Joi 提供了“摆脱重复的折磨”解决方案。

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

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

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

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

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

在上述代码中,我们针对例子中的 resources 资源对象定义了一个名为 resourceSchema 的 Joi 对象。而在需要进行数据校验时,我们只需要在 payload 的配置项内部使用 resourceSchema 即可轻松完成对此类资源对象的验证。

这种方法的优点在于能够降低重复的开发成本以及提高代码维护的效率。

总结

通过以上篇幅的介绍,我们可以总结出 Hapi.js 实现 API 参数校验的正确姿势,首先我们应该重视数据校验,并探究系统的校验方法,依据具体案例采用不同的数据校验方法来抵御不同的攻击。在具体实现时,我们应该注意业务需求的细节,避免在数据输入上出现非法的数据带来的数据损坏等情况。

同时,我们也可以借助 Joi 插件的特性完成良好的数据校验方案,这种方案能够极大地提高代码质量以及降低 Bug 的发生率。hope该文章对你有所帮助!

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64e74d93f6b2d6eab32e1987


猜你喜欢

  • 向 CSS 说再见:使用 LESS 加速网站。

    向 CSS 说再见:使用 LESS 加速网站 相信喜欢从事前端开发的朋友们都知道,CSS 是网页设计的重要组成部分,它可以控制网站的布局、颜色、字体等方面。但是,CSS 的语法有些繁琐冗长,而且难以扩...

    1 年前
  • 如何使用 Deno 处理压缩文件

    在前端开发中,我们经常需要处理压缩文件来提高页面的加载速度。在传统的 Node.js 环境下,我们可以使用诸如 Gzip 等库来完成这项任务,但很多人不知道 Deno 也可以轻松处理压缩文件。

    1 年前
  • 自定义元素的缺省值和属性优先级如何处理?

    前言 随着 Web 技术的不断发展,越来越多的开发者开始使用自定义元素来满足各种需求。然而,在使用自定义元素的过程中,经常会遇到一些缺省值和属性优先级的问题,这些问题可能会导致不一致的行为,甚至会影响...

    1 年前
  • 使用 Mocha 测试 React Native 应用的实践指南

    在开发 React Native 应用过程中,自动化测试是至关重要的一环。而 Mocha 是一个常用的 JavaScript 测试框架,它不仅可以测试 React Native 应用,还可以测试其他 ...

    1 年前
  • Koa2 中间件学习笔记:使用 koa-router 实现路由

    在 Koa2 中,路由是我们开发前端应用时必不可少的一部分。Koa2 框架本身并不支持路由功能,但可以借助 koa-router 中间件来实现。 什么是路由? 路由(Routing)是指根据 URL ...

    1 年前
  • 解决 Babel 编译 ES6 代码时出现的 "Support for the experimental syntax 'classProperties' isn't currently enabled" 错误

    在 ES6 中,我们可以方便地使用 class 属性 (class properties) 来定义类的属性。但是,当我们使用 Babel 编译 ES6 代码时,有时候会遇到以下错误: --------...

    1 年前
  • 使用 Vue.js 开发 SPA 应用的经验分享

    单页应用(SPA)是目前流行的一种 Web 应用程序架构,与传统的多页应用相比,SPA 的特点是只有一个静态 HTML 页面,其余内容都是异步加载的。SPA 对于前端开发人员来说,提供了更好的用户体验...

    1 年前
  • 解决 ECMAScript 2018 中 Promise 的链式调用问题

    Promise 是 JavaScript 中的一种常用的异步编程模式,通过链式调用可以有效地组合多个异步任务,实现复杂的操作流程。然而,在 ECMAScript 2018 中,Promise 的链式调...

    1 年前
  • 范畴捕获正则表达式:ECMAScript 2019 中新增的正则表达式特性

    ECMAScript 2019 中新增了一项正则表达式特性:范畴捕获(named capture)。通过该特性,我们可以使用名字来代表匹配的子串,使我们的代码更易读、更可维护。

    1 年前
  • ESLint:如何规避可被 XSS 攻击的代码?

    随着互联网的普及,网络安全问题越来越突出。XSS(跨站脚本攻击)是目前最常见的网络安全漏洞之一。XSS攻击可以利用网站中存在的安全漏洞,将恶意代码注入到网页中,从而造成网站数据被盗取或篡改等危害。

    1 年前
  • Sequelize 如何解决多表操作的问题

    在前端开发中,涉及到多个表格之间的数据操作是很常见的。Sequelize 是 Node.js 中非常流行的 ORM(对象关系映射)框架,它提供了一种方便快捷的方式来映射多个数据库表之间的关系,同时也可...

    1 年前
  • 如何使用 Node.js 和 Headless CMS 构建 Web 应用

    随着前端技术的快速发展,越来越多的 Web 应用开始采用前后端分离的架构。在这种架构下,前端只负责显示和交互逻辑,而后端则负责处理业务逻辑和数据存储。 为了提高开发效率和代码复用性,越来越多的 Web...

    1 年前
  • Redis 对 key 过期时间的处理方案及其优化

    引言 Redis 是目前流行的 NoSQL 数据库之一,它提供了快速、可靠、灵活的 Key-Value 存储方案,而且具有非常好的可扩展性。在 Redis 中,每个 Key 都可以设置过期时间,过期时...

    1 年前
  • Chai 如何对 API 进行测试?

    测试是前端开发过程中不可缺少的一部分。API 测试是测试中的一项重要工作,通过对 API 的测试可以验证其功能是否完整、性能是否优秀以及安全性如何。在前端测试框架中,Chai 是一个非常实用的工具,可...

    1 年前
  • Redux 实践之涉及到多个模块处理

    在实际开发中,我们通常需要处理多个模块的数据,并且这些模块可能存在相互调用的关系。Redux 是一种可预测的状态管理工具,它可以帮助我们轻松地管理应用程序的状态。在本篇文章中,我们将详细介绍 Redu...

    1 年前
  • 在 Kubernetes 中部署 Kafka 集群的方法

    Kafka 是一款高性能的消息队列,用于支持高并发、高可用性的数据流处理。在云原生应用开发中,Kubernetes 已经成为了一个广泛应用的容器调度和管理平台,许多应用开发者也开始将 Kafka 集群...

    1 年前
  • Vue.js 中如何使用 vue-cli 构建项目?

    Vue.js 是当前最受欢迎的前端框架之一,它非常适合用于构建现代化的 Web 应用程序。Vue.js 的出现是为了简化开发者在操作 DOM、处理数据等方面的工作,使开发过程更加高效和便捷。

    1 年前
  • MongoDB 全文搜索功能实现方法

    在 Web 应用程序中,文本搜索是一个重要的功能。为了实现强大的搜索功能,需要一种更高效,更健壮的方式来存储和管理数据。MongoDB 是一个流行的文档数据库,它提供了全文搜索功能,因此在开发 Web...

    1 年前
  • TypeScript 中的模块化详解

    在前端开发中,模块化是一个非常有用的工具,可以帮助我们更好地组织代码,提高代码的可维护性和可复用性。在 TypeScript 中,模块化也是一个非常重要的概念,本文将详细介绍 TypeScript 中...

    1 年前
  • 解决在 Next.js 中使用 API 接口遇到的问题

    背景 在前端开发中,有时需要使用接口获取数据。在 Next.js 中,我们可以使用内置的 API 路由来定义 API 接口,实现前后端分离。 然而,在实际开发过程中,我们可能会遇到使用 API 接口时...

    1 年前

相关推荐

    暂无文章