Я использую Joi для проверки данных, отправленных пользователем. Данные содержат банковские реквизиты: соответствующие здесь accountNumber
и sortCode
. Мне нужно взять значение обоих входов и запустить их через внешний API, чтобы убедиться, что они действительны вместе.
Я изо всех сил пытаюсь написать собственное расширение Joi, которое может получить значение другого поля в данных. Вот упрощенная версия того, что я пробовал:
const baseJoi = require('joi');
const bankDetails = joi => {
return {
name: 'bankDetails',
base: joi.number().required(),
rules: [
{
name: 'accountNumber',
params: {
number: joi.number().required()
},
validate(params, value, state, options) {
console.log(value); // returns 12-34-46 (sortCode)
console.log(params.number); // returns a [Function: ref] object
console.log(state.parent.accountNumber); // returns 88888888, but feels "wrong"
}
}
]
};
};
const Joi = baseJoi.extend([bankDetails]);
const validateBankDetails = () => {
return Joi.bankDetails().accountNumber(Joi.ref('accountNumber')).required();
};
const schema = Joi.object({
accountNumber: Joi.number().required(),
sortCode: validateBankDetails(),
});
Я знаю, что могу использовать Joi.ref()
внутри собственных валидаторов Джои (например, что-то вроде Joi.number().less(Joi.ref('max'))
), но здесь мне нужно взять значение этого ключа (accountNumber
) и передать его через в другую функцию (вместе со значением sortCode
). Есть ли одобренный Joi способ сделать это? Я могу получить желаемое значение из параметров state
, но это немного анти-паттерн.