node.js中joi模块的基本使用方式

 更新时间:2022年09月05日 11:45:15   作者:江呱呱  
这篇文章主要介绍了node.js中joi模块的基本使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

node.js joi模块的使用

//引入joi模块
const Joi = require('joi');
//定义对象的验证规则
const schema = {
    username: Joi.string().min(2).max(5).required().error(new Error('username属性没有通过验证')),
    birth: Joi.number().min(1900).max(2020).error(new Error('birth没有通过验证'))
};
async function run() {
    try {
        //实施验证
        await Joi.validate({ username: 'ab', birth: 1800 }, schema);
    } catch (ex) {
        console.log(ex.message);
        return;
    }
    console.log('验证通过');
}
run();

参数校验:使用joi

在编写api的时候通常都需要对参数进行校验,包括:

  • 参数的类型、必填等;
  • 字符串,是否可以为空、该符合什么规则等;
  • 数字,最大值最小值是什么等等等等。

Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能。

安装及使用:

npm install joi --save
import Joi from 'joi'

基础使用

使用joi进行校验,首先要定义它的校验规则,也叫schema。

const schema = Joi.string()

上面就定义了一个校验字符串类型的规则,这个schema会有一个 validate方法,传入需要校验的值:

const result = schema.validate('1')
console.log(result)
// 此时result为 { value: '1' }

validate方法会返回一个对象,如果验证通过,就只会返回value属性,如果验证错误,就还有一个error对象,其中error对象的message描述了失败原因:

const schema = Joi.string()
const result = schema.validate(1)
console.log(result)
// result:
{
  value: 1,
  error: [Error [ValidationError]: "value" must be a string] {
    _original: 1,
    details: [ [Object] ]
  }
}
console.log(result.error.message)
// "value" must be a string

常见schema

字符串、支持空字符串、必填(不能为undefined)

Joi.string().allow('').required()

数字、最小值18、最大值35

Joi.number().min(18).max(35)

数组、长度为3、子元素为字符串、

Joi.array().items(Joi.string()).length(3)

对象、只有p1属性且为字符串

Joi.object({
    p1: Joi.string()
})

函数

Joi.func()

日期

Joi.date()

任意

Joi.any()

正则regex

Joi.string().pattern(/\d/ig)

为空 undefined

Joi.empty()

列举可选值,用valid;age只能取14, 16, 18 中的其一

a字段的校验规则要根据b字段的规则确定;(疑问❓:age为数组的话,childAge为数组值中一个❓)

指向其他属性用ref、ancestor往上层对象中查找,找不到就验证失败

const schema = Joi.object({
    age: Joi.number().valid(14, 16, 18),
    childAge: Joi.number().valid(Joi.in('age')),
    childAgeBack: Joi.ref('childAge'),
    childAgeBack1: Joi.ref('childAge', {ancestor: 2}),
})

with、without、xor

  • with: 全选。 表示当设置的属性有一个出现了,其他也必须出现,上面的例子设置了a、b属性,需要同时存在或者同时不存在。
  • without: 二者择其一。第一个参数设置条件字段,第二个参数为字段数组,表示第一个参数字段存在的话,第二个参数数组里面的字段都不能存在。上面的例子就是当a字段出现时,b字段就不能存在。
  • xor: 一个或多个。表示设置的参数需要任何一个或多个存在。 
const schema = Joi.object({
  a: Joi.any(),
  b: Joi.any()
}).with('a', 'b');
const schema = Joi.object({
  a: Joi.any(),
  b: Joi.any()
}).without('a', ['b']);
const schema = Joi.object({
  a: Joi.any(),
  b: Joi.any()
}).xor('a', 'b');
  • when: 相当于条件判断,第一个参数传递属性名,is相当于if,then后面就是is为真的时候的校验条件。【mode字段只允许传入’email’和’phone’,当mode字段为’email’的时候,address字段就会进行email校验(joi自带的字符串邮箱校验)】
const schema = Joi.object({
  mode: Joi.string().allow('email', 'phone').required(),
  address: Joi.string().when('mode', { is: 'email', then: Joi.string().email() }).required()
});

特殊情况

  • Joi.string()默认情况不支持空字符串
  • required()必须放在最后,因为返回值为undefined

如果没有required(),可以不填值,填了就要遵循规则

对象schema中,默认不能传入指定外的属性。如果需要允许其他属性的出现,需要在跟上一个unknown方法。

const { error } = schema.validate({
  name: 'chaorenya'
}).unknown() // 允许出现其他字段
  • Joi.number()校验数字类型、如果字符串可以转换convert为数字,那么默认也会pass。
  • Joi.number()默认只支持js的safe范围(Number.MIN_SAFE_INTEGER & Number.MAX_SAFE_INTEGER))的数值;非safe范围需要指明:Joi.number().unsafe()

demos

// demo1
  if ((!req.body.keyList || !req.body.keyList.length) && !req.body.hasFilter) {
    return new req.Exception(`keyList / hasFilter ${req.ReturnMessages.INVALID}`)
  }
// joi ed
const schema = Joi.object({
    keyList: Joi.when('hasFilter', { is: Joi.not(true), then: Joi.array().min(1).required() }),
    hasFilter: Joi.boolean()
  })
// demo2
 if (!['FAT', 'FWS'].includes(ENV)) {
    return new req.Exception('env INVALID')
  }
// joi ed
const schema = Joi.object({  
    env:Joi.string().valid('FAT', 'FWS').insensitive().required()
  })
// 或者可以转换为大写再比较,Joi.string().uppercase().valid().required()  

参考:官网API文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 进阶之初探nodeJS

    进阶之初探nodeJS

    本文主要介绍了nodeJS的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • node.js生成与读取csv文件方法详解

    node.js生成与读取csv文件方法详解

    这篇文章主要介绍了node.js生成与读取csv文件方法详解,需要的朋友可以参考下
    2022-10-10
  • 通过Nodejs搭建网站简单实现注册登录流程

    通过Nodejs搭建网站简单实现注册登录流程

    这篇文章主要介绍了通过Nodejs搭建网站简单实现注册登录流程,Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。,需要的朋友可以参考下
    2019-06-06
  • Nodejs Buffer的使用及Stream流和事件机制详解

    Nodejs Buffer的使用及Stream流和事件机制详解

    这篇文章主要为大家介绍了Nodejs Buffer的使用及Stream流和事件机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • express框架中使用jwt实现验证的方法

    express框架中使用jwt实现验证的方法

    这篇文章主要给大家介绍了关于express框架中使用jwt实现验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用express具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 掌握Node.js中的Promise异步编程方式

    掌握Node.js中的Promise异步编程方式

    Node.js中的Promise是一种异步编程方式,可以解决回调地狱问题,提高代码可读性和可维护性。通过掌握Promise的使用方法,可以更好地进行异步编程,避免一些常见的错误和陷阱
    2023-05-05
  • socket.io与pm2(cluster)集群搭配的解决方案

    socket.io与pm2(cluster)集群搭配的解决方案

    这篇文章主要给大家介绍了关于socket.io与pm2(cluster)集群搭配的解决方案,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。
    2017-06-06
  • 在Nodejs中实现一个缓存系统的方法详解

    在Nodejs中实现一个缓存系统的方法详解

    在数据库查询遇到瓶颈时,我们通常可以采用缓存来提升查询速度,同时缓解数据库压力,在一些简单场景中,我们也可以自己实现一个缓存系统,避免使用额外的缓存中间件,这篇文章将带你一步步实现一个完善的缓存系统,需要的朋友可以参考下
    2024-03-03
  • npm淘宝镜像过期解决办法

    npm淘宝镜像过期解决办法

    npm 官方镜像在国内访问很慢,很多同学都会选择切换到国内的一些 npm 镜像,本文主要介绍了npm淘宝镜像过期解决办法,感兴趣的可以了解一下
    2024-02-02
  • node.js中koa和express的差异对比

    node.js中koa和express的差异对比

    Express和koa都是服务端的开发框架,服务端开发的重点是对HTTP Request和HTTP Response两个对象的封装和处理,下面这篇文章主要给大家介绍了关于node.js中koa和express的差异对比,需要的朋友可以参考下
    2023-05-05

最新评论