Hapi 是一个 Node.js 的框架,它提供了一套强大而灵活的工具来构建 Web 应用程序。其中一个非常有用的功能就是数据校验。在开发 Web 应用程序时,我们常常需要对用户提交的数据进行校验,比如验证用户输入的用户名和密码是否符合要求、验证邮箱地址、验证手机号码等等。Hapi 给我们提供了一套简单而强大的 API 来处理这些问题。
安装 Hapi
首先要做的是安装 Hapi,可以通过 npm 来进行安装:
npm install hapi
基本用法
下面是一个简单的例子,我们将使用 Hapi 来验证一个用户提交的表单数据:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------- ----- ------------ -------- -------- --------- -- - ----- - ----- ------ -------- - - ---------------- -- ------ -- --- ------ ------------- ------------ -- -------- - --------- - -------- - ----- ------------------------------- ------ --------------------------------------- --------- ------------------------------------- - - - --- ----- -------- ------- - ----- --------------- ------------------- ------- --- --------------------- - --------
在这个例子中,我们创建了一个 Hapi 服务器,监听在本地的 3000 端口上。我们定义了一个 /register
路由,用于处理用户提交的表单数据。在这个路由中,我们使用了 Hapi 的 validate
选项来定义了这个路由需要检验的数据类型。
Hapi.types.String()
表示这个字段的类型是字符串,.required()
表示这个字段必须存在。.email()
表示这个字符串必须是一个合法的邮箱地址。.min(8)
表示这个字符串的长度必须大于等于 8。
如果校验失败,Hapi 会返回一个错误响应,并且在错误对象中包含了校验的错误信息。
内置数据校验规则
Hapi 提供了许多内置的校验规则,包括字符串、数字、数组、日期等等。
下面是一些常用的校验规则:
字符串校验
const schema = { username: Hapi.types.String().alphanum().min(3).max(30).required(), password: Hapi.types.String().regex(/[a-zA-Z0-9]{3,30}/).required() };
.alphanum()
:字符串只能包含字母和数字。.min(3)
:字符串长度必须大于等于 3。.max(30)
:字符串长度必须小于等于 30。.required()
:字符串不能为空。
数字校验
const schema = { age: Hapi.types.Number().min(18).max(65).required(), salary: Hapi.types.Number().precision(2).required() };
.min(18)
:数字必须大于等于 18。.max(65)
:数字必须小于等于 65。.precision(2)
:数字必须精确到小数点后两位。
数组校验
const schema = { fruits: Hapi.types.Array().includes(Hapi.types.String().valid('apple', 'banana', 'pear')).required(), scores: Hapi.types.Array().includes(Hapi.types.Number().min(0).max(100)).required() };
.includes(item)
:数组必须包含指定的项,可以是字符串、数字等。
日期校验
const schema = { dob: Hapi.types.Date().min('1-1-2000').max('12-31-2010') };
.min()
:日期必须在指定日期之后。.max()
:日期必须在指定日期之前。
自定义数据校验规则
除了使用内置的数据校验规则,我们也可以自定义规则来验证数据。下面是一个例子,我们定义了一个校验器来检查用户名是否已被使用:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ----- - - - ----- -------- ------ ------------------- -- - ----- -------- ------ ------------------- -- - ----- -------- ------ ------------------- - -- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------- ----- ------------ -------- -------- --------- -- - ----- - ----- ------ -------- - - ---------------- -- ------ -- --- ------ ------------- ------------ -- -------- - --------- - -------- - ----- ---------------------------------- -------- -- - -- ------- ----- ------ - --------------- -- --------- --- ------- -- -------- - ------ --- --------------- ------- -------- - -------------- ------ --------------------------------------- --------- ------------------------------------- - - - --- ----- -------- ------- - ----- --------------- ------------------- ------- --- --------------------- - --------
在这个例子中,我们使用了 custom()
方法来定义一个自定义校验规则。这个函数将会接收两个参数:value
表示属性的值,options
表示一些额外的校验选项。在这个例子中,我们使用 users
数组来检查用户名是否已被使用,如果已被使用,则返回一个错误信息。
异步数据校验
有时候校验数据可能需要进行一些异步操作,比如查询数据库或者调用远程服务等。Hapi 对异步数据校验提供了良好的支持。
-- -------------------- ---- ------- -------------- ------- ------- ----- ------------ -------- ----- -------- --------- -- - ----- - ----- ------ -------- - - ---------------- -- ------ -- --- ------ ------------- ------------ -- -------- - --------- - ----- ---------------- -------- - -- ------ ----- ---- - ----- -------------- ------ ----- --- -- ------ - ----- --- ------------ ------- -------- - -- -------- - ----- ------------------------------- ------ --------------------------------------- --------- ------------------------------------- - - - ---
在这个例子中,我们使用了 async validator()
方法来定义了一个异步校验函数。这个函数将会接收两个参数:value
表示属性的值,options
表示一些额外的校验选项。在这个例子中,我们使用 User.findOne()
方法查询数据库,如果找到了一个与提交的邮箱地址相同的用户,则会抛出一个错误。
总结
Hapi 是一个强大而灵活的 Node.js 框架,它提供了强大的数据校验功能。在本文中,我们介绍了 Hapi 的一些基本用法和常用校验规则,并给出了一些示例代码。希望这篇文章能够对您了解 Hapi 的数据校验功能有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c75fc410032fedd3914180