如何在React Js和Node Js中用Joi进行对象验证

642 阅读4分钟

在这篇博客中,我们将看到如何使用Joi库进行对象和数组验证。对象验证在前端非常重要,可以限制用户输入有效数据,在后端也很重要,可以 验证进入REST API的内容不会破坏我们的代码。

什么是Joi?

Joi是一个强大的npm库,当我们需要执行这些检查时,例如验证来自后端端点的响应时,可以验证JavaScript对象。首先,让我们看看有哪些可用的库可以用来验证JavaScript对象。下面是一些流行的对象验证功能的库的列表。

1.ajv

2 .Express-validator

3. nope-validator

4. 解码器

5. swagger-parser

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进行对象验证的优势

  • 易于实现,易于学习。
  • 被广泛接受的知名数据验证包。
  • 支持基于模式的验证。

coma

总结

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