Проверка с динамическими объектами контекста в Joi - PullRequest
0 голосов
/ 18 июня 2019

Мне нужно использовать динамический объект для проверки значения.Объект регулярно меняется, поэтому я загружаю его во время выполнения и сохраняю его локально в виде правильно сформированного файла .json.Мне нужно передать эти значения в вызов Joi.validate (через параметр context) и убедиться, что элементы в массиве соответствуют одной из пар ключ / значение в объекте 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 голосов
/ 26 июня 2019

Вы можете создавать свою схему динамически каждый раз, когда обнаруживаете, что ваш файл изменился.Я не думаю, что вам нужна опция контекста в этом случае, если я не понимаю вашу проблему.

В моем примере кода каждый из элементов для проверки в массиве 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 должно обеспечить правильное достижениечто ожидается.

const fs = require('fs');
const path = require('path');

let schema;
let lastUpdate = 0;

// Assumes your file exists and is correctly json-formatted
// You should add some error handling
// This might also need to be tweaked if you want it to work in an asynchronous way
function check(theThingsToValidate) {
    let jsonPath = path.resolve(__dirname, 'data.json');
    let fileStats = fs.statSync(jsonPath);
    if (!schema || fileStats.mtimeMs > lastUpdate) {
        lastUpdate = fileStats.mtimeMs;
        let fileData = JSON.parse(fs.readFileSync(jsonPath, 'utf8'));
        schema = Joi.object().keys({
            'foo': Joi.array().unique().items(
                ...Object.keys(fileData).map(key => ({
                    id: key,
                    name: fileData[key]
                }))
            )
        });
    }

    return Joi.validate(theThingsToValidate, schema);
}

Примечание: mtimeMs был добавлен в Node 8, поэтому вам может потребоваться изменить его, если вы используете более низкую версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...