使用Joi来验证数据模型
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();
这种极简易读的表达方式让你轻松快速实现校验功能,不需要 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