使用Joi来验证数据模型

我与影子孤独终老i 提交于 2020-02-06 03:05:49

Joi模块简介

我们用nodejs实现一些功能时,往往需要对用户输入的数据进行验证。然而,验证是一件麻烦的事情,很有可能你需要验证数据类型,长度,特定规则等等,在前端做表单验证时,我们常用的做法是使用正则,正则表达式也许可以一步到位,但是他只会给你true or false,如果想要知道数据不符合哪些条件时,那么你要进一步判断,下面和大家分享一种可读性和易用性更好的实现方法。

Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能,JavaScript对象的规则描述语言和验证器。是本文就是介绍如何优雅地使用 joi 对数据进行校验。相信你会喜欢上它。

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();

以上scheme配置大致意思如下:

username: 字符串类型,长度在2至5之间,必填,自定义错误信息。

birth: 数字类型, 值在1900到2020之间,可选,自定义错误信息。

成功通过校验结果:
在这里插入图片描述
校验结果不通过:
在这里插入图片描述
在这里插入图片描述

这种极简易读的表达方式让你轻松快速实现校验功能,不需要 if else。这就是配置大于编码的魅力。

Joi模块更多使用方式

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()

更多玩法:https://github.com/hapijs/joi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!