文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

node.js中joi模块的基本使用方式

2024-04-02 19:55

关注

node.js 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();

参数校验:使用joi

在编写api的时候通常都需要对参数进行校验,包括:

Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能。

安装及使用:

npm install joi --save
import Joi from 'joi'

基础使用

使用joi进行校验,首先要定义它的校验规则,也叫schema。

const schema = Joi.string()

上面就定义了一个校验字符串类型的规则,这个schema会有一个 validate方法,传入需要校验的值:

const result = schema.validate('1')
console.log(result)
// 此时result为 { value: '1' }

validate方法会返回一个对象,如果验证通过,就只会返回value属性,如果验证错误,就还有一个error对象,其中error对象的message描述了失败原因:

const schema = Joi.string()
const result = schema.validate(1)
console.log(result)
// result:
{
  value: 1,
  error: [Error [ValidationError]: "value" must be a string] {
    _original: 1,
    details: [ [Object] ]
  }
}
console.log(result.error.message)
// "value" must be a string

常见schema

字符串、支持空字符串、必填(不能为undefined)

Joi.string().allow('').required()

数字、最小值18、最大值35

Joi.number().min(18).max(35)

数组、长度为3、子元素为字符串、

Joi.array().items(Joi.string()).length(3)

对象、只有p1属性且为字符串

Joi.object({
    p1: Joi.string()
})

函数

Joi.func()

日期

Joi.date()

任意

Joi.any()

正则regex

Joi.string().pattern(/\d/ig)

为空 undefined

Joi.empty()

列举可选值,用valid;age只能取14, 16, 18 中的其一

a字段的校验规则要根据b字段的规则确定;(疑问❓:age为数组的话,childAge为数组值中一个❓)

指向其他属性用ref、ancestor往上层对象中查找,找不到就验证失败

const schema = Joi.object({
    age: Joi.number().valid(14, 16, 18),
    childAge: Joi.number().valid(Joi.in('age')),
    childAgeBack: Joi.ref('childAge'),
    childAgeBack1: Joi.ref('childAge', {ancestor: 2}),
})

with、without、xor

const schema = Joi.object({
  a: Joi.any(),
  b: Joi.any()
}).with('a', 'b');
const schema = Joi.object({
  a: Joi.any(),
  b: Joi.any()
}).without('a', ['b']);
const schema = Joi.object({
  a: Joi.any(),
  b: Joi.any()
}).xor('a', 'b');
const schema = Joi.object({
  mode: Joi.string().allow('email', 'phone').required(),
  address: Joi.string().when('mode', { is: 'email', then: Joi.string().email() }).required()
});

特殊情况

如果没有required(),可以不填值,填了就要遵循规则

对象schema中,默认不能传入指定外的属性。如果需要允许其他属性的出现,需要在跟上一个unknown方法。

const { error } = schema.validate({
  name: 'chaorenya'
}).unknown() // 允许出现其他字段

demos

// demo1
  if ((!req.body.keyList || !req.body.keyList.length) && !req.body.hasFilter) {
    return new req.Exception(`keyList / hasFilter ${req.ReturnMessages.INVALID}`)
  }
// joi ed
const schema = Joi.object({
    keyList: Joi.when('hasFilter', { is: Joi.not(true), then: Joi.array().min(1).required() }),
    hasFilter: Joi.boolean()
  })
// demo2
 if (!['FAT', 'FWS'].includes(ENV)) {
    return new req.Exception('env INVALID')
  }
// joi ed
const schema = Joi.object({  
    env:Joi.string().valid('FAT', 'FWS').insensitive().required()
  })
// 或者可以转换为大写再比较,Joi.string().uppercase().valid().required()  

参考:官网API文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯