文档章节

joi模块验证的介绍与使用——一种基于schema的nodejs的对象校验,简单易用

tsunshine
 tsunshine
发布于 2017/05/20 22:59
字数 642
阅读 437
收藏 0

        joi是nodej的一个工具模块,主要用于JavaScript对象的校验。它是一种简单易用的javacript对象约束描述语言,可以轻松解决nodejs开发中的各种参数的校验。

详细资料见 https://github.com/hapijs/joi/tree/v10.5.0

        nodejs引入: 

const Joi = require('joi');

       开时使用:

const schema = Joi.object().keys({
    username: Joi.string().alphanum().min(3).max(30).required(),
    password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),
    access_token: [Joi.string(), Joi.number()],
    birthyear: Joi.number().integer().min(1900).max(2013),
    email: Joi.string().email()
}).with('username', 'birthyear').without('password', 'access_token');


const result = Joi.validate({ username: 'abc', birthyear: 1994 }, schema);
//result --> { error: null, value: { username: 'abc', birthyear: 1994 } }
//result.error === null, 说明校验通过 ,result.value校验的对象

//也可以使用回调函数,异步获取校验结果,
Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function (err, value) { 

});

     上面的例子定义了一个schema,包含的意思如下:

  •      username 

              Joi.String() -- 定义类型必须是字符串类型

              .alphanum() -- 定义必须包含字母或数字

              .min(3).max(30) -- 定义字段长度3-30

              .required() -- 定义必修字段

              .with('username','birthyear') -- 校验对象字段必须和birthyear同时存在

  • password

              .regex(/^[a-zA-Z0-9{3-30}$/) -- 定义字段必须匹配正则规则。

              .without('password','access_token') -- 校验对象中,'password'与'access_token'不同是存在

  • access_token

              .[Joi.string(),Joi.number()] -- 定义字段类型为数字类型或字符串类型

              没有.required()约束 -- 定义字段为可选字段

  •  birthyear

               .Joi.number().integer() -- 定义字段为数字整型

               .min(1900).max(1994) -- 定义字段值范围在1900-1994

  • email

               .email() -- 定义字段为邮箱地址

     用法

 使用分两步完成 第一步使用joi提供的类型与约束定义一个schema      

const schema = {
    a: Joi.string()
};

        注意:joi schema对象是不可变,这意味着每增加一条规则(e.g. .min(5))将会返回一个新的schema对象。

第二步 通过定义的schema完成值的校验

const {error, value} = Joi.validate({ a: 'a string' }, schema);

// or

Joi.validate({ a: 'a string' }, schema, function (err, value) { });

如果输入的值校验有效,则err===null 否则将会返回错误对象

schema可以使用普通的JavaScript对象,其中对象的字段关联joi类型来定义。也可以直接使用一个joi类型定义

const schema = Joi.string().min(10);

如果schema是直接使用joi类型定义 ,则可以直接使用schema.validate(value,callback)验证。如果是一个非joi类型对象的定义的shema ,实质joi模块会转换成object() 类型,等同如下:

const schema = Joi.object().keys({
    a: Joi.string()
});

 

  • joi模块的字符串编码默认为utf-8
  • 详细API见API Reference.

    原创,转载请注明出处。

 

© 著作权归作者所有

tsunshine
粉丝 0
博文 2
码字总数 901
作品 0
杭州
私信 提问
Mongoose,nodejs和mongodb的连接器。

简介 今天我们将学习Mongoose,什么是Mongoose呢,它于MongoDB又是什么关系呢,它可以用来做什么呢,介绍Mongoose之前,我们先简单了解一下MongoDB。 MongoDB是一个开源的NoSQL数据库,相比M...

笔阁
2015/10/13
2.2K
0
如何选择正确的Node框架:Express,Koa还是Hapi?

简介 Node.js是10年前首次推出的,目前它已经成为世界上最大的开源项目,在GitHub上有+59,000颗星,下载次数超过10亿。流行度快速增长的部分原因是Node.js允许开发人员在应用程序的客户端和服...

一二三OTT
04/24
0
0
巨头终极对决,Apache、Nginx 与 Node.js 之争

巨头之间的终极对决:崛起的新星 Node.js 能否战胜巨人 Apache 和 Nginx?WordPress 与 Ghost 的性能大对决! 我和你一样,都阅读过大量散布在互联网各处的意见或事实,其中有一些我认为是可...

局长
2016/12/02
9.8K
37
《Node.js开发指南》书评汇总

刚查了下库存,发现订阅《Node.js开发指南》的读者大增,这是为什么呢?看了下近期本书在豆瓣的评论,口碑很好,现将豆瓣的书评汇总如下: ----------------------------------------------...

生气的散人
2012/10/15
0
0
《Node.js开发指南》书评汇总

刚查了下库存,发现订阅《Node.js开发指南》的读者大增,这是为什么呢?看了下近期本书在豆瓣的评论,口碑很好,现将豆瓣的书评汇总如下: ----------------------------------------------...

生气的散人
2012/10/15
3.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
5
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
8
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部