使用joi来验证数据模型
我们用nodejs实现一些功能时,往往需要对用户输入的数据进行验证。然而,验证是一件麻烦的事情,很有可能你需要验证数据类型,长度,特定规则等等,在前端做表单验证时,我们常用的做法是使用正则,正则表达式也许可以一步到位,但是他只会给你true or false,如果想要知道数据不符合哪些条件时,那么你要进一步判断,下面和大家分享一种可读性和易用性更好的实现方法。
Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能,本文就是介绍如何优雅地使用 joi 对数据进行校验。相信你会喜欢上他。便于大家理解,以登录为例,一般分两种方式:A或B (输入密码或二维码),那么 joi 的配置如下即可实现检验:
var Joi = require('joi');
var schema = Joi.object({
username: Joi.string().min(3).max(30).required(),
isA: Joi.boolean(),
AVal: Joi.number(),
isB: Joi.boolean(),
BVal: Joi.string()
})
.with('isA', 'AVal')
.with('isB', 'BVal')
.without('isA', 'isB')
.or('isA', 'isB');
以上scheme配置大致意思如下:
username: 字符串类型,长度在3至30之间,必填。
isA: 布尔类型,可选
AVal: 数字类型, 可选
isB: 布尔类型, 可选
BVal: 字符串类型, 可选
with('isA', 'AVal') //意思是,isA 和 AVal 这两字段如果填写了isA,也必须要填写AVal
with('isB', 'BVal') //道理同上
without('isA', 'isB'); //意思是 isA 和 isB 只能填写其中一个
or('isA', 'isB') //意思是 isA 和 isB 这两字段至少填写其一
Let's try
var input = {
username: 'zzbo'
}
var output = Joi.validate(input, schema);
//error: ValidationError: "value" must contain at least one of [isA, isB]
提示至少要填写 isA 或 isB 其中之一
再看:
var input = {
username: 'zzbo',
isA: true
}
var output = Joi.validate(input, schema);
//error: ValidationError: "isA" missing required peer "AVal"
提示 AVal 必填
再来:
var input = {
username: 'zzbo',
isA: true,
AVal: 666666
}
var output = Joi.validate(input, schema);
//error: null
成功通过校验
这种极简易读的表达方式让你轻松快速实现校验功能,不需要 if else。这就是配置大于编码的魅力。
不仅于scheme对象
joi 不仅仅作用于scheme对象,而且还可以单独使用,比如:
Joi.string().validate(666666); //error: ValidationError: "value" must be a string
Joi.string().validate('hehe'); // pass
有时一些意外的字段被传进来,会导致校验不通过,但你又不在乎这些多余的字段,可以这样配置:
Joi.validate({y: 3}, {x: Joi.string()}); // [ValidationError: "y" is not allowed]
Joi.validate({y: 3}, {x: Joi.string()}, {allowUnknown: true}); // pass, 配置 {allowUnknown: true}
除了表单常用的数值,布尔类型等,也可以校验函数类型:
var myObject = {
a: 123,
b: function () { }
}
var schema = {
a: Joi.number().integer(),
b: Joi.func()
}
Joi.validate(myObject, schema);
//pass
除此之外,还有更多类型Joi.any(), Joi.array(), Joi.boolean(), Joi.date(), Joi.func(), Joi.number(), Joi.object(), Joi.string()
更多玩法
数字 + 特定的字符串:
Joi.number().allow('a').validate('a'); // pass
Joi.number().valid('a').validate('a'); // pass
Joi.number().valid(['a', 'b']).validate('b'); // pass
Joi.number().allow('a').validate(3); // pass
不能是数字5:
Joi.number().invalid(5).validate(5); // error
允许是任何类型:
Joi.any().validate() // pass
如果需要校验对象的子对象,那么Joi的描述也可以作为了一个子对象:
var Joi = require('joi');
var schemeAB = Joi.object({
A: Joi.string().required(),
B: Joi.string().required()
});
var schemeCD = Joi.object({
C: Joi.string().required(),
D: schemeAB //可以作为子对象
});
var output = Joi.validate({
C: 'hehe',
D: {
A: 'haha',
B: 'hoho'
}
}, schemeCD);
console.log(output);
//pass
Joi提供的校验条件不够用?也可以使用正则:
Joi.object({
password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/)
});
在 hapijs 中使用Joi
hapijs 自家的Joi 当然要无缝对接起来
var Hapi = require('hapi');
var Joi = require('Joi');
var server = new Hapi.Server();
server.connection({
port: 8000
});
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
if (request.query.hour && request.query.minute) {
reply(request.query.hour + ':' + request.query.minute);
} else {
reply('time unknown');
}
},
config: {
validate: {
query: {
hour: Joi.number().min(0).max(23),
minute: Joi.number().min(0).max(59)
}
}
}
});
server.start(function(err) {
if (err) throw err;
console.log('Server running...');
});
就是如此简单的配置就即可完成数据验证,体配置大于
调试一下:
http://127.0.0.1:8000/?hour=2&minute=3 //pass
http://127.0.0.1:8000/?hour=2&minute=300 //error
最后
小伙伴们赶紧动手来尝试一下。
Joi 的更多用法可以参考文档:https://github.com/hapijs/joi/blob/v8.0.5/API.md
使用joi来验证数据模型的更多相关文章
- ASP.NET Core WebApi中使用FluentValidation验证数据模型
原文链接:Common features in ASP.NET Core 2.1 WebApi: Validation 作者:Anthony Giretti 译者:Lamond Lu 介绍 验证用户输 ...
- 使用JSON Schema来验证接口数据
最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...
- LINQ to SQL更新数据库操作(转载)
使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...
- Django实现博客项目
一.项目概述 项目运行环境 Python3.6+ Django 1.11 MySQL 5.7 其他插件(图片处理.分页.验证码....) 项目详细功能介绍 前台功能 项目首页展示 轮播图 博客推荐 最 ...
- 复习 - node.js(接口案例)
其实复习一次的作用真实太大了,真的,自从上次ajax开始其实就开始i有点懵懵懂懂的感觉,一直拖想到了node在去回顾一遍,这一次回去复习,ajax已经很熟练了,node之前搞不懂那些原理也顺清楚了好多 ...
- 第三方库文件Joi对数据进行验证的方法以及解决Joi.validate is not a function的问题
Joi:javaScript对象的规则描述语言和验证器 1.npm install joi@14.3.1 2.建立joi.js文件 3.导入第三方包joi const Joi = require('j ...
- 7,SFDC 管理员篇 - 数据模型 - 公式和验证 1
1,自定义公式 Customize | Your Object | Fields | Add Fields Field SF的公式和Excel的公式差不多,都是支持各种运算和结果 例1,以opport ...
- 8,SFDC 管理员篇 - 数据模型 - 公式和验证 2
1, Checkbox 只接受真值或者假值 And(arg1, arg2....)至少两个参数,只有参数都为真时候,才返回真,只要有一个为假,就都为假 例如:AND(DoNotCall, HasOpt ...
- webapi - 模型验证
本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...
随机推荐
- fedora25 下配置samba
本例是在 / 目录下建立share 文件夹为例 Sudo dnf install samba samba-common samba-clientsudo mkdir /share sudo chmod ...
- linux学习笔记——基础命令
最近看了一些老男孩linux运维视频,挺不错的,特此记录一下 linux组成 gun组件 shell等 linux内核 其他软件 linux主要内核: linux kernel2.2 linux ke ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- linux 登录档配置分析
登录档的重要性 解决系统方面的错误: 解决网络服务的问题: 过往事件记录簿: Linux 常见的登录档档名 /var/log/cron: 你的 crontab 排程有没有实际被进行? 进行过程有没有发 ...
- ZT 螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,
病情分析:过敏是治不好的,只能做到避免接触.指导意见:螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,尤其是狗经常去的地方,草地就是螨虫的传播介质.你是过敏性体质除了被免 过敏性源外,还要增强体质 ...
- ROS 新手教程 命令汇总
## 工作环境搭建 查看环境变量的配置: wangsan@wangsan-Y50:~$ export | grep ROS declare -x ROSLISP_PACKAGE_DIRECTORIES ...
- JavaWeb 学习001-登录页面
首先实现一个web应用的登录页面 1.遇到的问题: Servlet中 post 或者 get 方式 不能提交? 就是提交后,控制台没有反应,而且浏览器显示如图: 这样应该是不能进行页面的跳转,对这个, ...
- 16.10.16学到的JAVA知识
1. 每个字节就是八位,所以每个字节的取值范围是 -128~127,它可以保存一个英文字符,包括字母,数字和英文标点.而汉字的的数量很多,一个字节没法把所有的汉字表达出来,所以汉字就是用两个字节来存 ...
- JS产生随机数
<script> function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random() ...
- js jQuery中文字符串比较
先说下普通字符串(英文)比较: 一般使用双等来判断(==),如果还需要类型相同那么就用三等(===) 1. 双等(==)是完全向后兼容的,如果两个操作数类型不一致,它会在某些时候自动对操作数进行类型转 ...