iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >node.js中joi模块的基本使用方式
  • 404
分享到

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

2024-04-02 19:04:59 404人浏览 八月长安
摘要

目录node.js joi模块的使用参数校验:使用joi基础使用常见schema特殊情况demosnode.js joi模块的使用 //引入joi模块 const Joi = req

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文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: node.js中joi模块的基本使用方式

本文链接: https://www.lsjlt.com/news/166832.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • node.js中joi模块的基本使用方式
    目录node.js joi模块的使用参数校验:使用joi基础使用常见schema特殊情况demosnode.js joi模块的使用 //引入joi模块 const Joi = req...
    99+
    2022-11-13
  • Node.js使用方式及模块化的方法
    本篇内容介绍了“Node.js使用方式及模块化的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是Node.js Node.js 是一...
    99+
    2023-06-29
  • Python下rrdtool模块的基本使用方法
    最近需要用python根据收集到的数据进行绘图,决定使用rrd数据库,然后配合rrdtool来绘图,故学习一下rrdtool的用法。 用法如下: 创建: create(...) create(args..)...
    99+
    2022-06-04
    使用方法 模块 Python
  • Node.js基础入门之使用方式及模块化详解
    目录什么是Node.js Node.js下载 Node.js和JavaScript的区别Node.js安装与验证 Node.js使用方式1. REPL模式2. 文...
    99+
    2022-11-13
  • Python中csv模块的基本使用教程
    1、csv简介 CSV (Comma Separated Values) ,即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符。很多程序在处理数据时都...
    99+
    2022-06-02
    python的csv模块 python标准库csv的用法 python csv库
  • 详解Golang中gcache模块的基本使用
    目录先说结论优势基本使用打印结果缓存控制打印结果缓存淘汰策略实战举例代码示例打印结果小技巧GetOrSetFunc的使用总结gcache提供统一的缓存管理模块,提供了开发者可自定义灵...
    99+
    2022-11-11
  • python模块中pip命令的基本使用
    目录pip的基本使用安装pippip 升级安装包升级包卸载包搜索包显示安装包信息查看指定包的详细信息列出已安装的包查看已安装的包及其版本查看可升级的包使用镜像源临时使用设置为默认使用...
    99+
    2022-11-12
  • Node.js中fs模块的使用方法
    引入fs模块 var fs=require('fs'); 1. fs.stat检测是文件还是目录 fs.stat('html/style.css', function (err, s...
    99+
    2022-11-13
  • Node http模块基本使用方法是什么
    这篇文章主要介绍了Node http模块基本使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node http模块基本使用方法是什么文章都会有所收获,下面我们一起来看看吧。http 模块使用 Nod...
    99+
    2023-07-05
  • Node.js中Request模块处理HTTP协议请求的基本使用教程
    这里来介绍一个Node.js的模块——request。有了这个模块,http请求变的超简单。 Request使用超简单,同时支持https和重定向。 var request = require('...
    99+
    2022-06-04
    模块 协议 教程
  • 解析Node.js基于模块和包的代码部署方式
    模块路径解析规则 有经验的 C 程序员在编写一个新程序时首先从 make 文件写起。同样的,使用 NodeJS 编写程序前,为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手...
    99+
    2022-06-04
    模块 代码 方式
  • Python第三方模块apscheduler安装和基本使用
    目录apscheduler 模块apscheduler 模块介绍支持的后端存储作业APScheduler有四种组成部分各组件简介apscheduler 模块使用触发器类型apsche...
    99+
    2023-03-06
    Python apscheduler安装和使用 Python apscheduler安装
  • Python多路复用selector模块的基本使用
    目录1. IO多路复用1.1. epoll,poll, select的比较2. selector模块的基本使用1. IO多路复用 O多路复用技术是使用一个可以同时监视多个IO阻塞的中...
    99+
    2022-11-12
  • node.js中优雅的使用Socket.IO模块的方法
    目录前言Socket.IO的定义Socket.IO的优点node中安装Socket.IOnode中使用Socket.IOemiton在express中引入使用服务端客户端小结前言 上...
    99+
    2022-12-08
    node.js使用Socket.IO模块 node.js Socket.IO
  • TableLayout的基本使用方式
    TableLayout是一个用于显示表格数据的布局容器,它可以让子视图按行和列进行排列。下面是TableLayout的基本使用方式:...
    99+
    2023-09-13
    TableLayout
  • PowerMockito的基本使用方式
    本篇内容主要讲解“PowerMockito的基本使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PowerMockito的基本使用方式”吧!PowerMockito经常会结合Mockito...
    99+
    2023-06-20
  • react中braft-editor的基本使用方式
    目录braft-editor的基本使用项目需求使用braft-editor踩坑记,引用 braft-utils有错误遇到的问题解决方式braft-editor的基本使用 项目需求 实...
    99+
    2022-11-13
  • SpringBoot JMX的基本使用方式
    目录SpringBoot JMX的基本使用1. 声明2. 基本demo3. 执行结果springboot自定义jmx对象什么情况我们需要使用JMX?那要怎么做呢?SpringBoot...
    99+
    2022-11-12
  • python爬虫之请求模块urllib的基本使用
    目录前言urllib的子模块HttpResponse常用方法与属性获取信息urlli.parse的使用(一般用于处理带中文的url)✅爬取baidu官网HTML源代码✅添加请求头信息...
    99+
    2022-11-10
  • Node.js中的VM模块怎么使用
    本篇内容主要讲解“Node.js中的VM模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的VM模块怎么使用”吧!参考文献 vm 虚拟机...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作