代码之家  ›  专栏  ›  技术社区  ›  Adron

当将Joi与Hapi一起使用时,如何在一个键上设置一个要求,但允许任何和所有其他键?

  •  10
  • Adron  · 技术社区  · 12 年前

    我想写一篇 乔伊 验证进入 哈皮 处理程序。到目前为止,代码如下:

    server.route({
        method: 'POST',
        path: '/converge',
        handler: function (request, reply) {
            consociator.consociate(request.payload)
                .then (function (result) {
                    reply (200, result);
                });
        },
        config: {
            validate: {
                payload: {
                    value: Joi.object().required().keys({ knownid: Joi.object() })
                } 
            }
        }
    });
    

    您可以看到 乔伊 到目前为止,上面的config:validate:code部分中的对象验证。进来的JSON看起来像这样。

    "key": '06e5140d-fa4e-4758-8d9d-e707bd19880d-testA',
    "value": {
        "ids_lot_args": {
            "this_id": "stuff",
            "otherThign": "more data"
        },
        "peripheral_data": 'Sample peripheral data of any sort'
    }
    

    在上面的JSON中,需要对象根处的键和值 ids_lot_args 需要。以peripheral_data开头的部分可能存在或不存在,也可能是任何其他JSON负载。这无关紧要,只有根级别的键和值 ID _批次_参数 值内的值是必需的。

    到目前为止,我在努力获得 乔伊 验证工作。 关于如何设置此功能有什么想法吗? Joi的代码库位于 https://github.com/hapijs/joi 如果有人想去看看。到目前为止,我一直在尝试对象上的allow-all函数,但都没有效果。

    3 回复  |  直到 11 年前
        1
  •  8
  •   Gergo Erdosi    12 年前

    你只需要打电话给 unknown() 上的函数 value 对象:

    var schema = Joi.object({
      key: Joi.string().required(),
      value: Joi.object({
        ids_lot_args: Joi.object().required()
      }).unknown().required()
    });
    
        2
  •  3
  •   Jaraxal    11 年前

    您可以使用“allowUnknown”参数:

    validate : {
      options : {
        allowUnknown: true
      },
      headers : {
      ...
      },
      params : {
      ...
      },
      payload : {
      ...
      }
    }
    

    }

        3
  •  1
  •   dicemaster    12 年前

    尝试使用Joi.any()

    server.route({
        method: 'POST',
        path: '/converge',
        handler: function (request, reply) {
            consociator.consociate(request.payload)
                .then (function (result) {
                    reply (200, result);
                });
        },
        config: {
            validate: {
                payload: {
                    key: Joi.string().required(),
                    value: Joi.object({
                      ids_lot_args: Joi.object().required(),
                      peripheral_data: Joi.any()
                    })
                } 
            }
        }});