📅  最后修改于: 2023-12-03 15:32:57.773000             🧑  作者: Mango
在 Mongoose 模型中使用 Joi 验证可以帮助开发者加强对数据的有效性和正确性的验证,防止一些非法数据的输入。
Joi 是一个用于 Node.js 的对象模式验证器,它的 API 设计简洁易用,功能强大,同时 Joi 支持链式调用,可以非常方便地进行联合验证、异步调用和验证中止等等操作。Joi 已经成为 Node.js 社区中非常流行的一个模块,广泛用于 HTTP 请求中的参数验证、Mongoose 模型验证、客户端表单验证等场景。
首先,我们需要先安装 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 格式的验证。
const email = Joi.string().email().required();
上述代码中,我们定义了一个 email 字段的验证规则,该规则要求 email 字段必须符合 email 格式,并且不能为空。
const username = Joi.string().alphanum().min(3).max(30).required();
上述代码中,我们定义了一个 username 字段的验证规则,该规则要求 username 字段只能包含字母数字字符,并且长度为 3 - 30 个字符,并且不能为空。
const birthYear = Joi.number().integer().min(1900).max(2022).required();
上述代码中,我们定义了一个 birthYear 字段的验证规则,该规则要求 birthYear 字段必须为整数类型,并且在区间 [1900, 2022] 内,并且不能为空。
const isVerified = Joi.boolean().required();
上述代码中,我们定义了一个 isVerified 字段的验证规则,该规则要求 isVerified 字段必须为 Boolean 类型,并且不能为空。
const emails = Joi.array().items(Joi.string().email().required()).min(1).required();
上述代码中,我们定义了一个 emails 字段的验证规则,该规则要求 emails 字段必须为数组类型,并且数组中的每一个元素必须符合 email 格式,并且数组长度最少为 1。
以上就是 Mongoose 模型中使用 Joi 验证的介绍,Joi 在 Node.js 中的应用非常广泛,我们只需要根据自己的业务需求定义对应的验证规则即可,大大提高了 Node.js 程序的健壮性和可靠性。