在Joi中使用动态上下文对象进行验证

时间:2019-06-18 17:39:41

标签: javascript json validation schema joi

我需要使用动态对象来验证值。对象会定期更改,因此我将在运行时下载该对象并将其保存为本地格式良好的.json文件。我需要将这些值输入到对Joi.validate的调用中(通过'context'选项),并验证数组中的项是否与上下文对象中的键/值对之一匹配。

// the defined schema
const schema = Joi.object().keys({
  'foo': Joi.array()
    .unique()
    .items(
      // these items need to match the keys/values from the context object
      Joi.object().keys({
        id: Joi.string()
          .required(), // this needs to be a key from the context object
        name: Joi.string()
          .required(), // this needs to be the value from the context object for the key defined by the above id property
      }),
    )
})

// the .json file with the context object looks as such
{
  "id of first thing": "name of first thing",
  "id of second thing": "name of second thing",
  ...
}

// validation is done like this:
Joi.validate(theThingsToValidate, schema, {context: objectFromTheJsonFile});

1 个答案:

答案 0 :(得分:0)

每次检测到文件已更改时,都可以动态构建模式。在这种情况下,除非我误解了您的问题,否则我认为您不需要上下文选项。

在我的示例代码中,\nSize(s): $size\n 数组中要验证的每个元素都采用格式

foo

,并且必须以这种格式匹配文件中的元素之一

{
    id : 'id of thing',
    name: 'name of thing'
}

转换文件中的数据以构建所有有效对象的列表并将其传递到{ "id of first thing": "name of first thing", "id of second thing": "name of second thing", ... } 应该可以正确实现预期的效果。

Joi.array().items

注意:mtimeMs已在节点8中添加,因此如果运行的是较低版本,则可能需要更改它。