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

时间:2016-06-10 09:18:41

标签: node.js validation express 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

5 个答案:

答案 0 :(得分:57)

订购替换为将有效。

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,
)

供参考click here

答案 1 :(得分:8)

一个基本/更清晰的示例如下。 要验证这样的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(),
        }),
    },
  };

这是我在NodeJ中所做的,可能需要对其他平台进行一些细微更改

答案 2 :(得分:0)

只想使其更加清晰。我目前正在使用“ @ 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);

答案 3 :(得分:0)

对于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(),
    });

答案 4 :(得分:-1)

const test = {
body: Joi.array()
    .items({
        x: Joi.string().required(),
        y: Joi.string().required(),
        z: Joi.string().required(),
        date: Joi.string().required(),
    })

};