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