在这篇博客中,我们将看到如何使用Joi库进行对象和数组验证。对象验证在前端非常重要,可以限制用户输入有效数据,在后端也很重要,可以 验证进入REST API的内容不会破坏我们的代码。
什么是Joi?
Joi是一个强大的npm库,当我们需要执行这些检查时,例如验证来自后端端点的响应时,可以验证JavaScript对象。首先,让我们看看有哪些可用的库可以用来验证JavaScript对象。下面是一些流行的对象验证功能的库的列表。
1.ajv
4. 解码器
Joi的实施步骤
让我们看看如何在Express应用程序中使用Joi一步一步地验证javascript对象。
1.定义package.json文件。
首先,创建一个项目文件夹并定义package.json文件init,编写以下命令。
npm init -y
2.安装。
首先,创建Express应用程序并安装Joi库。接下来,你需要在你的终端写下以下一行。
npm install Joi
3.创建模式。
安装成功后,你必须导入Joi并为我们需要验证的对象创建模式。在模式中,我们为对象中的每个值设置一些特定的规则。让我们看看如何创建一个模式。
const Joi = require('Joi');
//Joi schema to validate the object data
const schema = Joi.object().keys({
name: Joi.string().alphanum().min(3).max(30).required(),
email: Joi.string().email()
});
const dataToValidate = {
Name: “John”,
email: “john@domain.com”
}
const result = Joi.validate(dataToValidate, schema);
// result.error == null means valid
在上面的代码中,我们已经为我们的API有效载荷创建了一个模式,其中我们有两个字段。我们在Joi的帮助下对这两个字段进行验证。
在这里,我们要做的是两件事。
首先,我们使用Joi.object()方法构建了一个模式,然后我们使用Joi.validate()方法验证我们的数据对象。
如果我们的数据是有效的,那么Joi.validate(schema, dataToValidate)将返回null,否则,它将返回错误对象,根据返回值,我们可以发送API的状态。
4.构造函数支持。
我们可以为所有的基元验证数据,就像我们的regex一样。而且我们还可以嵌套到任何深度。让我们看看一些基本的构造函数,我们可以用它来验证Joi的数据。
- string:这表示值必须是字符串,我们这样使用它,Joi.string()
- 数字:这表示值必须是数字。Joi.number()也支持min()和max()等辅助操作,像这样Joi.number().min(1).max(10)
- 需要:这表示该属性是必须的,如Joi.string().required()
- 任何:这表示该属性可以是任何类型,通常我们倾向于将其与辅助工具allow()一起使用,以指定其可以包含的内容,比如,Joi.any().allow('a')
- 可选的:optional不验证类型,但在应用其他验证后,如果该属性不是强制性的,我们可以使用它,像这样,Joi.string().optional这意味着如果没有提供值,那么就没有问题,但如果提供了值,而原始值是一个整数或字符串以外的任何值,验证将失败。
- 数组:这表示该属性必须是数组,我们这样使用它 Joi.array().items(Joi.string().valid('a', 'b'))
- regex:它也支持RegEx的模式匹配,像这样Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/)
5.验证嵌套对象
到目前为止,我们只展示了如何创建一个层次的模式。现在我们来看看如何创建嵌套模式。
const personalData = Joi.object().keys({
name: Joi.string().alphanum().min(3).max(30).required(),
email: Joi.string().required(),
address: Joi.object.keys({
country: Joi.string().required(),
state: Joi.string().required(),
city: Joi.string().required(),
zip_code: Joi.number().required()
}))
});
这里我们有一个嵌套模式。这个地址模式看起来 与我们首先进行的外部调用完全一样。嵌套就是这么简单。
6.Joi作为一个中间件
我们可以把Joi作为中间件,在每次需要验证时使用它。通过这种方法,我们可以消除每个API中用于验证的额外代码。为了创建中间件,首先,在项目目录中创建一个中间件文件夹,并在该文件夹中创建validationMiddleWare.js。在这个文件中,添加编写以下代码。
exports.validate = (schema) => (req, res, next) => {
const {
error
} = schema.validate(req.body);
if (error) {
res.status(422)
.send(error.details[0].message);
} else {
next();
}
};
它将接收一个模式,并根据该模式检查我们的req.body。
现在,创建一个名为validation.js的文件。这将保存我们的模式。把下面的代码粘贴到其中。
const Joi = require("joi");
exports.person = Joi.object()
.keys({
name: Joi.string()
.min(3)
.max(40)
.required(),
age: Joi.number()
.integer()
.min(16)
});
现在,在导入这两个文件后,像这样创建一个API。
const validation = require('./validation')
const {
validate
} = require('./validationMiddleware')
app.post("/", validate(validation.person), (req, res) => {
res.send("request processed");
});
const validation = require('./validation')
const {
validate
} = require('./validationMiddleware')
app.post("/", validate(validation.person), (req, res) => {
res.send("request processed");
});
在React Js和Node Js中使用Joi进行对象验证的优势
- 易于实现,易于学习。
- 被广泛接受的知名数据验证包。
- 支持基于模式的验证。

总结
在这篇博客中,我们看到了如何在Joi的帮助下验证对象和数组,什么是模式,在创建模式时支持构造函数,以及如何验证数据。然后,最后我们看到了使用Joi的优势。 谢谢你的阅读!