首页 > 解决方案 > 如何创建 joi 模式来验证对象的对象

问题描述

我试图制作模式来验证 json 这样的:

 {
  "integration": { "module": [ "m" ] },
  "tile": {
    "title": "TTT",
    "text": "ttt",
    "icon": "./resources/main-icon.png",
    "tags": [ "bbb", "vvvv"],
    "orderNumber": 20
  },
  "steps": {
    "order": [
      "1",
      "2",
      "3"
    ],
    "data": {
      "1": {
        "title": "tt1",
        "description": "",
        "screens": { "default": "true" }
      },
      "2": {
        "title": "tt2",
        "description": "",
        "screens": { "default": "true" }
      },
      "3": {
        "title": "tt3",
        "description": "",
        "screens": { "default": "true" }
      }
    }
  }
};

架构:

Joi.object({
  integration: Joi.object({
    module: Joi.array().items(Joi.string().valid('m').required())
    }).required(),
  tile: Joi.object({
    title: Joi.string().required(),
    text: Joi.string().required(),
    icon: Joi.string().required(),
    tags: Joi.array().items(Joi.string()).required(),
    orderNumber: Joi.number().integer().min(1).max(255).required()
  }).required(),
  steps: Joi.object({
    order: Joi.array().items(Joi.string()).required(),
    data: Joi.object().keys({
      title: Joi.string().required(),
      description: Joi.string().required(),
      screens: Joi.object({
        default: Joi.string().valid('true', 'false').required()
      }).required()
    }).unknown(),
  }).required()
});

但它会产生错误:

验证错误:需要“steps.data.title”。“steps.data.description”是必需的。“steps.data.screens”是必需的

请帮忙。我怎样才能制作这个架构?

标签: validationobjectschemajoi

解决方案


您的数据键是具有键 1、2 和 3 的对象,每个对象也是具有键标题、描述和屏幕的对象。

但是在您的验证中,您的数据键是一个带有键标题、描述和屏幕的对象,这是不正确的。

您应该将您的 steps.data 验证更改为:

data: Joi.object().pattern(
    Joi.string().valid("1", "2", "3"),
    Joi.object().keys({
        title: Joi.string().required(),
        description: Joi.string().required().allow(''),
        screens: Joi.object({ default: Joi.string().valid('true', 'false').required() }),
    })).unknown(),
}).required()

我使用Joi.object().pattern来避免重复代码,因为每个键的对象值都是相同的。

我还更改了你的 data.description,因为你不允许空字符串,我只是添加了.allow('')


推荐阅读