【玩转Node.js】数据校验模块(快速上手 Joi 模块)

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志——苏轼

写在前面

我们在用 Node.js 的时候经常会用到数据校验,在做数据校验的时候通常采用的方式是正则表达式,虽然正则表达式可以很严谨的帮助我们做校验,但是正则表达式的返回值通常只有 true or false ,而且书写正则表达式又是特别费时费力的工作。于是 Joi 模块就出现了。它可以帮助我们解决数据校验的问题。

Joi

Joi 是 JavaScript 对象的规则描述语言和验证器,可以帮助我们简单、直观和可读的方式来描述数据。

Joi 的安装

这里使用的是 Joi 14.3.1 命令命令如下所示:

npm install joi@14.3.1

在这里插入图片描述

用法

Joi 的用法一般分为三个步骤

  1. 引入 Joi 模块

    // 引入 Joi 模块
    const Joi = require('joi')
    
  2. 使用提供的类型和约束模式构建一个 Joi 约束模式对象。示例代码如下所示:

    // 定义验证规则
    const schema = {
      // 约束username的类型为字符串类型。
      // Joi.string() 的返回值又是一个 Joi 对象,所以可以链式调用这个对象
      username: Joi.string().min(2).max(20) // 表示username为字符串类型最小长度为2最大长度为20
    }
    
  3. 通过 validate() 方法进行验证,语法结构如下所示:

    validate(value, schema)
    

    参数说明:

    • value: 表示要验证的值
    • schema : 表示验证架构

    该方法是一个异步方法,如果校验成功则返回值为当前数据内容,否则返回一个 ValidationError 对象

    示例代码如下所示:

    async function run() {
      try {
        // 实施验证
        let test = await Joi.validate({
          username: 'sweet'
        }, schema)
        console.log(test);
      } catch (e) {
        console.log(e);
        return;
      }
    }
    run() 
    

    调用 Joi.validate() 方法进行数据校验,如果验证成功则返回其数据内容,验证失败则进入 catch 语句。

这就是 Joi 模块的基本用法。

验证规则

对一个字段的基本验证规则是:类型 / 长度范围 / 取值范围 / 是否必填 / 与其它字段的关系 / 默认值 / 错误处理

Joi 中的类型

在 Joi 中 any() 表示任意类型,指定类型如下表所示:

方法描述
array()数组类型
boolean()布尔类型
binary()缓冲区数据类型
func()函数类型
number()数字类型
object()对象类型
string()字符串类型

长度范围

规定长度范围的验证规则是 max()min()。如果在数组中,这个长度就表示数组的长度,字符串中则表示字符串中的长度,数字则表示数字的大小。

示例代码如下所示:

const s = {
  // 数组的最小长度为2, 最大长度为10
  arr: Joi.array().min(2).max(10),
  // 字符串的最小长度为2, 最大长度为10
  str: Joi.string().min(2).max(10),
  // 数字值的最小值是10,最大值是100
  num: Joi.number().min(10).max(100)
}

取值范围

规则取值范围的是 valid() 表示必须在这个取值范围内,而 invaild() 则表示不能在这个取值范围内。示例代码如下所示:

const s = {
  // 必须是数字1或者数字2否则抛出异常
  num1: Joi.any().valid(1, 2),
  // 不能是数字1或者数字2,否则抛出异常
  num2: Joi.any().invalid(1, 2)
}

是否必填

required() 方法表示此选项为必填项。示例代码如下所示:

const schema = Joi.any().required();

与其它字段的关系

when() 用于灵活的转变类型,语法结构如下所示:

any.when(condition, options)

参数说明

  • condition: 表示键名称
  • options 具有三个参数
    • is: 所需的条件 joi 类型。
    • then: 如果条件为 true,则为备用架构类型。
    • otherwise: 如果条件为 false,则为备用架构类型。

示例代码如下所示:

// 引入 Joi 模块
const Joi = require('joi')
// 定义验证规则
const s = {
  // 如果传入的数据 是 数字, 大,则数字必须是50-100,如果是 数字 小则数字必须是 0-50 之间
  num: Joi.number().min(0).max(100).when('size', {
    is: '大',
    then: Joi.number().min(50).max(100),
    otherwise: Joi.number().min(0).max(50)
  }),
  size: Joi.any().valid('大', '小')
}

async function run() {
  try {
    // 实施验证
    let test = await Joi.validate({
      num: 80,
      size: '大'
    }, s)
    console.log(test);
  } catch (e) {
    console.log(e);
    return;
  }
}
run()

执行结构如下所示:

{ num: 80, size: '大' }

如果将大改为小则会抛出异常。

默认值

在 Joi 中定义默认值使用 default() ,如果我们的数据中存在 undefined 则校验之后会变成我们设置的默认值,这个值仅仅对 undefined 有效,对 null 并没有效果。

校对规则如下所示:

async function run() {
  try {
    // 实施验证
    let test = await Joi.validate(undefined, Joi.string().default("没有值"))
    console.log(test);
  } catch (e) {
    console.log(e);
    return;
  }
}
run()

执行结果为 :没有值

错误处理

我们可以通过 error(err) 方法来自定义一个错误来覆盖 Joi 的错误。

示例代码如下所示:

async function run() {
  try {
    // 实施验证
    let test = await Joi.validate(null, Joi.string().default("没有值").error(new Error('传入的值为 null ')))
    console.log(test);
  } catch (e) {
    console.log(e.message);
    return;
  }
}
run()

执行结果为 传入的值为 null

写在最后

如果文章对您有帮助,帮帮三连。蟹蟹啦~

大哥们点点关注不迷路

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
对于数据库操作,Node.js 有许多可选的模块和库可以使用。一种常见的选择是使用 `mysql`、`mongodb` 或 `sequelize` 模块来连接和操作数据库。这些模块提供了简单的接口来执行查询、插入、更新和删除等操作。 例如,如果你使用MySQL数据库,你可以使用 `mysql` 模块来连接到数据库并执行查询。以下是一个简单的示例: ```javascript const mysql = require('mysql'); // 创建数据库连接 const connection = mysql.createConnection({ host: 'localhost', user: 'username', password: 'password', database: 'database_name' }); // 连接到数据库 connection.connect((err) => { if (err) throw err; console.log('Connected to the database!'); }); // 执行查询 connection.query('SELECT * FROM tablename', (err, results) => { if (err) throw err; console.log(results); }); // 关闭连接 connection.end(); ``` 关于表单验证,Node.js 有许多库可以帮助你处理表单数据的验证和验证错误的处理。一些 popular 的表单验证库包括 `express-validator` 和 `joi`。 使用 `express-validator` 的示例代码如下: ```javascript const { body, validationResult } = require('express-validator'); const express = require('express'); const app = express(); // 定义一个路由处理程序 app.post('/create', [ // 对表单字段进行验证 body('username').notEmpty().withMessage('Username is required'), body('email').isEmail().withMessage('Invalid email'), body('password').isLength({ min: 6 }).withMessage('Password must be at least 6 characters long'), ], (req, res) => { // 检查验证错误 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // 处理表单数据 // ... // 返回成功的响应 res.json({ message: 'Form submitted successfully' }); }); app.listen(3000, () => { console.log('Server started on port 3000'); }); ``` 以上是一些基本的示例代码,你可以根据自己的需求和数据库选择进行修改和扩展。希望能对你有所帮助!如果有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗周.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值