Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用Joi验证对象数组?_Node.js_Validation_Express_Joi - Fatal编程技术网

Node.js 如何使用Joi验证对象数组?

Node.js 如何使用Joi验证对象数组?,node.js,validation,express,joi,Node.js,Validation,Express,Joi,我得到了一个后端对象数组,其中每个对象都包含一个服务名称。 结构如下所示 [{"serviceName":"service1"}, {"serviceName":"service2"},..] 在后端获取阵列时,我希望验证阵列中的每个对象是否都具有serviceName属性 我已经编写了以下代码,但即使我通过了有效数组,我也会得到验证错误 var Joi = require('joi'); var service = Joi.object().keys({ serviceName: Joi

我得到了一个后端对象数组,其中每个对象都包含一个服务名称。 结构如下所示

[{"serviceName":"service1"},
{"serviceName":"service2"},..]
在后端获取阵列时,我希望验证阵列中的每个对象是否都具有serviceName属性

我已经编写了以下代码,但即使我通过了有效数组,我也会得到验证错误

var Joi = require('joi');
var service = Joi.object().keys({
  serviceName: Joi.string().required()
});

var services = Joi.array().ordered(service);

var test = Joi.validate([{serviceName:'service1'},{serviceName:'service2'}],services)
对于上面的代码,我总是得到带有消息的验证错误

"value" at position 1 fails because array must contain at most 1 items

项目替换已订购的将有效

let Joi = require('joi')
let service = Joi.object().keys({
  serviceName: Joi.string().required(),
})

let services = Joi.array().items(service)

let test = Joi.validate(
  [{ serviceName: 'service1' }, { serviceName: 'service2' }],
  services,
)

仅供参考

我只想说清楚一点。我目前正在使用“@hapi/joi:16.1.7”

假设您希望您的模式验证这个对象数组

const example = [
   {
      "foo": "bar",
      "num": 1,
      "is_active": true,
   }
];
那么架构的规则应该是:

var validator = require('@hapi/joi');

const rules = validator.array().items(
    validator.object(
        foo: validator.string().required(),
        num: validator.number().required(),
        is_active: validator.boolean().required(),
    ),
);

const { error } = rules.validate(example);

对于您可以在下面使用的Joi,它对我来说运行良好,这将验证数组必须至少在对象上具有键serviceName-

const Joi = require('joi');
const itemsArray = Joi.array().items(
            Joi.object({
                serviceName: Joi.string().required(),
            })
        ).min(1).required();

        const itemSchema = Joi.array().items(itemsArray).when('checkout_type', {
            is: 'guest',
            then: Joi.array().required(),
        }).required();

let schema = Joi.object().keys({
        items: Joi.alternatives().try(itemsArray, itemSchema).required(),
    });

下面是一个基本/更清晰的示例。 要验证JSON请求,请执行以下操作:

   {
    "data": [
            {
        "keyword":"test",
        "country_code":"de",
        "language":"de",
        "depth":1
            }
        ]
    }
以下是Joi验证:

 seoPostBody: {
    body: {
      data: Joi.array()
        .items({
          keyword: Joi.string()
            .required(),
          country_code: Joi.string()
            .required(),
          language: Joi.string()
            .required(),
          depth: Joi.number()
            .required(),
        }),
    },
  };
这就是我在NodeJs中所做的,可能需要对其他平台进行一些轻微的更改


})

正是我需要的。谢谢大家!
Joi.validate
从版本16开始就不推荐使用。要保持相同的解决方案,您现在所要做的就是代替
Joi.validate([],services)
,您可以执行
services.validate([],回调)
services.validateSync([])
它将通过空数组
service=[]
使用
Joi.array().min(1).项(服务)
以确保服务包含一些值。事实上,现在也不需要.key()函数,这也可以工作。让service=Joi.object({serviceName:Joi.string().required(),});欢迎来到堆栈溢出。对于堆栈溢出,不鼓励使用仅代码的答案,因为它们没有解释堆栈溢出是如何解决问题的。请编辑您的答案,以解释此代码的作用,以及它如何改进此问题已有的现有向上投票的答案,以便对具有类似问题的其他用户有用。
const test = {
body: Joi.array()
    .items({
        x: Joi.string().required(),
        y: Joi.string().required(),
        z: Joi.string().required(),
        date: Joi.string().required(),
    })