📜  Mongoose 模型中的 Joi 验证 (1)

📅  最后修改于: 2023-12-03 15:32:57.773000             🧑  作者: Mango

Mongoose 模型中的 Joi 验证

在 Mongoose 模型中使用 Joi 验证可以帮助开发者加强对数据的有效性和正确性的验证,防止一些非法数据的输入。

什么是 Joi?

Joi 是一个用于 Node.js 的对象模式验证器,它的 API 设计简洁易用,功能强大,同时 Joi 支持链式调用,可以非常方便地进行联合验证、异步调用和验证中止等等操作。Joi 已经成为 Node.js 社区中非常流行的一个模块,广泛用于 HTTP 请求中的参数验证、Mongoose 模型验证、客户端表单验证等场景。

如何在 Mongoose 模型中使用 Joi 验证?

首先,我们需要先安装 joi 和 joi-objectid 库:

npm install joi joi-objectid

然后,我们在 Mongoose 模型的 Schema 中添加验证规则:

const Joi = require('joi');
const JoiObjecId = require('joi-objectid')(Joi);

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 20
  },
  email: {
    type: String,
    required: true,
    unique: true,
    validate: {
      validator: (email) => Joi.string().email().validate(email),
      message: 'Invalid email'
    }
  },
  password: {
    type: String,
    required: true,
    minlength: 8,
    maxlength: 20,
    validate: {
      validator: (password) => Joi.string().regex(/^[a-zA-Z0-9]{8,20}$/).validate(password),
      message: 'Invalid password'
    }
  },
  avatar: {
    type: String,
    validate: {
      validator: (avatar) => JoiObjecId.isValid(avatar),
      message: 'Invalid avatar'
    }
  }
});

如上代码中,在 Mongoose 模型的 Schema 定义中,我们通过 Joi 的 API 定义了 name、email、password、avatar 字段的验证规则,同时也可以利用 joi-objectid 库进行 ObjectID 格式的验证。

针对常见场景的 Joi 验证实例
Joi.string().email().required()
const email = Joi.string().email().required();

上述代码中,我们定义了一个 email 字段的验证规则,该规则要求 email 字段必须符合 email 格式,并且不能为空。

Joi.string().alphanum().min(3).max(30).required()
const username = Joi.string().alphanum().min(3).max(30).required();

上述代码中,我们定义了一个 username 字段的验证规则,该规则要求 username 字段只能包含字母数字字符,并且长度为 3 - 30 个字符,并且不能为空。

Joi.number().integer().min(1900).max(2022).required()
const birthYear = Joi.number().integer().min(1900).max(2022).required();

上述代码中,我们定义了一个 birthYear 字段的验证规则,该规则要求 birthYear 字段必须为整数类型,并且在区间 [1900, 2022] 内,并且不能为空。

Joi.boolean().required()
const isVerified = Joi.boolean().required();

上述代码中,我们定义了一个 isVerified 字段的验证规则,该规则要求 isVerified 字段必须为 Boolean 类型,并且不能为空。

Joi.array().items(Joi.string().email().required()).min(1).required()
const emails = Joi.array().items(Joi.string().email().required()).min(1).required();

上述代码中,我们定义了一个 emails 字段的验证规则,该规则要求 emails 字段必须为数组类型,并且数组中的每一个元素必须符合 email 格式,并且数组长度最少为 1。

总结

以上就是 Mongoose 模型中使用 Joi 验证的介绍,Joi 在 Node.js 中的应用非常广泛,我们只需要根据自己的业务需求定义对应的验证规则即可,大大提高了 Node.js 程序的健壮性和可靠性。