使用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

  

posted @ 2021-06-30 20:55  流弊的小涛  阅读(224)  评论(0编辑  收藏  举报