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

When using Joi with Hapi, how does one setup a require on one key but allow any and all other keys?

本文关键字:一个 许任何 其他 设置 Hapi Joi      更新时间:2023-09-26

我正试图为进入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: code部分看到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有效负载。没有关系,只需要根级的键和值以及值内的ids_lot_args

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

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

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

您可以使用"allowUnknown"参数:

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

}

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