【问题标题】:When using Joi with Hapi, how does one setup a require on one key but allow any and all other keys?将 Joi 与 Hapi 一起使用时,如何在一个键上设置要求但允许任何和所有其他键?
【发布时间】:2014-10-08 13:03:47
【问题描述】:

我正在尝试为进入 Hapi 处理程序的 JSON 对象编写 Joi 验证。到目前为止,代码如下所示:

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: 代码部分中看到 Joi 对象验证。传入的 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 有效负载。没关系,只需要根级别的key和value以及value内部的ids_lot_args即可。

到目前为止,我一直在尝试让 Joi 验证正常工作。 关于如何设置的任何想法? 如果您想查看,Joi 的代码库位于https://github.com/hapijs/joi。到目前为止,我一直在尝试允许对象上的所有功能无济于事。

【问题讨论】:

    标签: javascript json validation hapijs


    【解决方案1】:

    您只需要在value 对象上调用unknown() 函数:

    var schema = Joi.object({
      key: Joi.string().required(),
      value: Joi.object({
        ids_lot_args: Joi.object().required()
      }).unknown().required()
    });
    

    【讨论】:

      【解决方案2】:

      尝试使用 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()
                      })
                  } 
              }
          }});
      

      【讨论】:

        【解决方案3】:

        您可以使用“allowUnknown”参数:

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

        }

        【讨论】:

          猜你喜欢
          • 2018-09-28
          • 2020-07-03
          • 2015-07-19
          • 2021-10-16
          • 2020-03-25
          • 1970-01-01
          • 2022-11-13
          • 2022-01-22
          • 1970-01-01
          相关资源
          最近更新 更多