如何创建 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","3": {
        "title": "tt3","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”是必需的

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

解决方法

您的数据键是一个带有键 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('')