首页 > 编程语言 >node.js 使用joi来验证数据模型

node.js 使用joi来验证数据模型

时间:2024-08-12 11:50:25浏览次数:13  
标签:node string required number js Error joi Joi 数据模型

node.js 使用joi来验证数据模型

 

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

 

  直接上代码

复制代码
// 导入joi模块 
const joi = require('joi')

// 定义验证规则
const schema = joi.object({
    // username必须是字符串类型、最小长度是2、最大长度是6、必填项、自定义验证失败错误信息
    username: joi.string().min(2).max(6).required().error(new Error('用户名格式不正确')),
    // email必须是字符串类型、必须符合邮箱格式、必填项、自定义验证失败错误信息
    email: joi.string().email().required().error(new Error('邮箱格式不正确')),
    // pwd必须是字符串类型、必须符合指定的正则规则、自定义验证失败错误信息
    pwd: joi.string().regex(/^[a-zA-Z0-9]+$/).error(new Error('密码格式不正确')),
    // sex必须是数字类型、值是0或1、必填项、自定义验证失败错误信息
    sex: joi.number().valid(0, 1).required().error(new Error('性别格式不正确')),
   // 可以根据sex的值来定义name2的类型属性 name2: joi.when('sex', { is: 1, then: joi.string().required().error(new Error('name2格式不正确')) }),
name3: joi.string().max(2).allow('').error(new Error('name3格式不正确')),
   // 针对数组的操作 orderItems: joi.array().items( joi.object().keys({ thirdOrderItemId: joi.string().required().error(new Error('订单明细ID不能为空')), productName: joi.string().required().error(new Error('商品名称不能为空')) }) ) }); let body = { username: "adm", email: '[email protected]', pwd: 'abc123', sex: 1, phone: '13', name2: "1", name3: "", orderItems: '[{\"thirdOrderItemId\": \"123\",\"productName\": \"151515\"}]' }; body.orderItems = JSON.parse(body.orderItems) // 针对数组操作必须是json对象,如果是json字符串需要自己解析一次。 async function run() { try { /*验证*/ await schema.validateAsync(body, { allowUnknown: true, abortEarly: true }); console.log('验证成功'); } catch (e) { console.log(e.message); } }
run();

  另外还有一些基本的操作粘在下面以作参考

// 3 - 30 个 数字、字符
username: Joi.string().alphanum().min(3).max(30).required(),

// 3 - 30 位 字母数字组合密码
password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),

// string || number 都可以通过
access_token: [Joi.string(), Joi.number()],

// 生日限制
birthyear: Joi.number().integer().min(1900).max(2018),

// email 限制
email: Joi.string().email(),

// URI限制
website: Joi.string().uri({ scheme: [ 'git', /git+https?/ ] }),

// ==== 允许为空/ 否认不允许为空 ====
search: Joi.string().allow(''),

// 验证枚举值,如果不传,默认为all
type: Joi.string().valid('disabled', 'normal', 'all').default('all'),

// 开始时间 会自动格式化
startTime: Joi.date().min('1-1-1974').max('now'),

// 结束时间 必须大于开始时间,小于2100-1-1
endTime: Joi.when(Joi.ref('startTime'), { is: Joi.date().required(), then: Joi.date().max('1-1-2100') }),

// 页码 限制最小值
page: Joi.number().integer().min(1).default(1), pageSize: Joi.number().integer().default(8),
// deleteWhenLtTen: Joi.number().integer().max(10).strip(),

// 数组中包含某个字段 && 数字
arrayString: Joi.array().items(
// 数组中必须包含 name1
Joi.string().label('name1').required(),
// 数组中必须包含 数字
Joi.number().required(),
// 除掉【以上类型的以外字段】---数组中可以包含其他类型,如bool
Joi.any().strip()
),

// 数组对象, 如需其参考以上字段
arrayObject: Joi.array().items(
Joi.object().keys({
age: Joi.number().integer().max(200),
sex: Joi.boolean()
})
)

with('isA', 'AVal') //意思是,isA 和 AVal 这两字段如果填写了isA,也必须要填写AVal
with('isB', 'BVal') //道理同上
without('isA', 'isB'); //意思是 isA 和 isB 只能填写其中一个
or('isA', 'isB') //意思是 isA 和 isB 这两字段至少填写其一

 
复制代码

值得注意的地方是:在安装的时候一定要指定版本,然后根据指定版本的文档去看详细的操作。

allowUnknown - 如果为 true,则允许对象包含被忽略的未知键。 默认为 false。

abortEarly - 当为真时,停止对第一个错误的验证,否则返回找到的所有错误。 默认为  true。

例如:

    npm install [email protected]

官方文档https://joi.dev/api/?v=17.4.2

github地址https://github.com/sideway/joi/blob/v17.3.0/API.md

标签:node,string,required,number,js,Error,joi,Joi,数据模型
From: https://www.cnblogs.com/sexintercourse/p/18354672

相关文章

  • node项目log4js进行日志记录
    node项目log4js进行日志记录超人鸭关注IP属地:广东0.1072022.09.0818:25:04字数1,973阅读827安装与了解npminstalllog4js--save目前的版本是:6.6.1在终端打印消息:importlog4jsfrom'log4js'constlogger=log4js.getLogger()logger.level='all'lo......
  • 记录JSch连接SFTP Exception:Algorithm negotiation fail问题解决
    问题描述:关于正式环境访问外网连接不成功 1、首先检查是否开放防火墙(已确认开放),策略开放后,通过命令连接是否畅通: 通过telnet命令,可以得出,访问畅通。telnet192.168.1.122 2、查看生产环境日志,观察生产环境访问外网服务器异常:抛出异常,提示:算法协商失败com.jcraft.j......
  • nodejs+阿里云实现发送短信验证码
    一、阿里云短信服务打开阿里云短信服务控制台1.新增资质2.新增模板与签名3.等待审核通过二、node代码1.首先需要下载依赖npmi@alicloud/pop-core--save2.引入依赖关键信息建议放环境变量中 accessKeyId和accessKeySecret在这里↓ 以下是代码constC......
  • Shell处理Json数据
    在Shell中处理复杂的JSON数据,一般有以下三种方式:jq:jq是一款强大的JSON处理工具,支持过滤、修改、重组和生成JSON数据。Python:使用Python来处理复杂的JSON数据。结合了Shell脚本的便利性和Python处理JSON的强大能力grep/sed/awk:在无其他工具的情况下使用grep/sed/awk等(不......
  • Vue.js入门系列(五):深入理解监视属性与计算属性的对比
    个人名片......
  • 深入解析@JsonValue注解在Java序列化中的应用
    深入解析@JsonValue注解在Java序列化中的应用在Java开发中,对象序列化是一个常见的需求,尤其是在进行网络通信或者数据持久化时。Jackson库作为Java领域内一个非常流行的JSON处理库,提供了强大的序列化和反序列化功能。在Jackson2.9版本之后,@JsonValue注解的引入,为开发者提供......
  • JS那些api会改变原数组,哪些不会
    会改变数组增删1.push() 在数组最后面插入项,返回数组的长度arr.push(插入元素) 2.pop()在数组最后取出一项,返回取出项arr.pop()3.shift()取出数组中第一项,返回取出项arr.shift() 4.unshift()在数组最前面插入项,返回数组的长度arr.unshift()  5.spli......
  • Vue.js 搭建大屏可视化系统 - 最全指南
    引言随着数据量的增长和业务需求的变化,大屏可视化系统成为了展示实时数据、监控关键指标的重要手段。Vue.js作为一款流行的前端框架,提供了丰富的工具和插件,非常适合用于构建这种类型的系统。本文将引导你从零开始,逐步构建一个高效、可扩展的大屏可视化系统。vue大屏系统项目......
  • 横向滚动条 css js html
    目的:1.练习手写滚动条2.市面上多是竖向滚动条,横向滚动条较少3.横向滚动条,需要滑动到容器底部才能使用,不方便,因此想自己写一个横向滚动条放置在容器内部的视口高度的最低处3.问题复现:如果容器的内容超过了容器的宽度,就会出现横向滚动条(暂不考虑换行),但是如果该容器的高......
  • Windows ,elasticsearch 启动报错 failed to obtain node locks
    报错:2024.08.1118:14:45ERRORes[][o.e.b.ElasticsearchUncaughtExceptionHandler]uncaughtexceptioninthread[main]org.elasticsearch.bootstrap.StartupException:java.lang.IllegalStateException:failedtoobtainnodelocks,tried[[D:\soft\Java\sonarq......