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

zak*_*kir 29 validation node.js express joi

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

[{"serviceName":"service1"},
{"serviceName":"service2"},..]
Run Code Online (Sandbox Code Playgroud)

当我在后端获取数组时,我想验证数组中的每个对象都有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)
Run Code Online (Sandbox Code Playgroud)

对于上面的代码,我总是收到带有消息的验证错误

"value" at position 1 fails because array must contain at most 1 items
Run Code Online (Sandbox Code Playgroud)

zak*_*kir 73

更换订购商品将有效.

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,
)
Run Code Online (Sandbox Code Playgroud)

如需参考,请点击此处

  • 从版本 16 开始,“Joi.validate”已被弃用。要保持相同的解决方案,您现在要做的就是用“services.validate([],callback)”代替“Joi.validate([], services)” ` 或 `services.validateAsync([])` (5认同)
  • 它将通过空数组 `service = []` 的验证,使用 `Joi.array().min(1).items(service)` 确保 service 包含一些值。 (2认同)

小智 14

一个基本/更清晰的例子如下。要验证这样的 JSON 请求:

   {
    "data": [
            {
        "keyword":"test",
        "country_code":"de",
        "language":"de",
        "depth":1
            }
        ]
    }
Run Code Online (Sandbox Code Playgroud)

这是 Joi 验证:

 seoPostBody: {
    body: {
      data: Joi.array()
        .items({
          keyword: Joi.string()
            .required(),
          country_code: Joi.string()
            .required(),
          language: Joi.string()
            .required(),
          depth: Joi.number()
            .required(),
        }),
    },
  };
Run Code Online (Sandbox Code Playgroud)

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


小智 8

const test = {
body: Joi.array()
    .items({
        x: Joi.string().required(),
        y: Joi.string().required(),
        z: Joi.string().required(),
        date: Joi.string().required(),
    })
};
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出。Stack Overflow 上不鼓励仅提供代码答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释此代码的作用以及它如何改进该问题已有的现有已投票答案,以便它对具有类似问题的其他用户有用。 (3认同)