#node.js #validation #schema #joi
#node.js #проверка #схема #joi
Вопрос:
Используя Joi, как мне сделать так, чтобы схема требовала rent.max
только тогда, когда type
либо A
или B
И subType
либо AA
или BB
? Вот моя попытка.
const Joi = require("joi");
const schema = Joi.object().keys({
type: Joi.string().valid('A', 'B', 'C').required(),
subType: Joi.string().valid('AA', 'BB', 'X'),
rent: Joi.object().keys({
price: Joi.number().required().precision(2),
// max is allowed only when type is A or B
// and subType is AA or BB.
max: Joi.alternatives()
.when('type', {
is: Joi.valid('A', 'B'),
then: Joi.alternatives().when('subType', {
is: Joi.valid('AA', 'BB'),
then: Joi.number(),
otherwise: Joi.forbidden()
}),
otherwise: Joi.forbidden()
})
})
});
const obj = {
type: 'A',
subType: 'AA',
rent: {
price: 3000.25,
max: 300.50,
}
};
const result = Joi.validate(obj, schema);
console.log(result.error);
Я ожидаю, что проверка завершится неудачей, но это не так.
Ответ №1:
Если вы хотите проверить тип и подтип ключей, ваша проверка должна выполняться после объекта, например:
const schema = Joi.object({
type: Joi.string().valid('A', 'B', 'C'),
subType: Joi.string().valid('AA', 'BB', 'X'),
rent: Joi.object({
amount: Joi.number(),
price: Joi.number().required().precision(2),
})
}).when(Joi.object({
type: Joi.string().valid('A', 'B').required(),
subType: Joi.string().valid('AA', 'BB').required()
}).unknown(), {
then: Joi.object({
rent: Joi.object({
amount: Joi.number().required()
})
}),
otherwise: Joi.object({
rent: Joi.object({
amount: Joi.forbidden()
})
})
});
Это результаты для следующих примеров:
// FAIL - requires amount
const obj = {
type: 'A',
subType: 'BB',
rent: {
price: 10
}
};
// FAIL - amount is not allowed
const obj = {
type: 'A',
subType: 'X',
rent: {
amount: 3000.25,
price: 300.50
}
};
// SUCCESS
const obj = {
type: 'A',
subType: 'BB',
rent: {
amount: 3000.25,
price: 300.50
}
};
// SUCCESS
const obj = {
type: 'A',
subType: 'X',
rent: {
price: 300.50
}
};