我如何 运行 针对我的模式中的不同键进行自定义验证?
How can I run a custom validation against a different key in my schema?
我正在使用 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 自己的验证器中使用 Joi.ref()
(例如 Joi.number().less(Joi.ref('max'))
之类的东西)但在这里我需要使用 value键 (accountNumber
) 并将其传递给另一个函数(连同 sortCode
值)。有没有 Joi 认可的方法来做到这一点?我可以从 state
参数中得到我想要的值,但这感觉有点反模式。
您是否尝试过在普通的旧 Joi 对象上使用 custom
method 而不是扩展?我认为它可能会以更直接的方式为您提供所需的信息:
const schema = Joi.object({
accountNumber: Joi.number().required(),
sortCode: Joi.number().required(),
})
.custom((obj, helpers) => {
// you have access to the full object above.
const { accountNumber, sortCode } = obj;
// Do your validation
const isValid = doSomething(accountNumber, sortCode);
if (!isValid) {
throw new Error('Invalid input');
}
// Just pass the object on through if things work.
return obj;
});
我正在使用 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 自己的验证器中使用 Joi.ref()
(例如 Joi.number().less(Joi.ref('max'))
之类的东西)但在这里我需要使用 value键 (accountNumber
) 并将其传递给另一个函数(连同 sortCode
值)。有没有 Joi 认可的方法来做到这一点?我可以从 state
参数中得到我想要的值,但这感觉有点反模式。
您是否尝试过在普通的旧 Joi 对象上使用 custom
method 而不是扩展?我认为它可能会以更直接的方式为您提供所需的信息:
const schema = Joi.object({
accountNumber: Joi.number().required(),
sortCode: Joi.number().required(),
})
.custom((obj, helpers) => {
// you have access to the full object above.
const { accountNumber, sortCode } = obj;
// Do your validation
const isValid = doSomething(accountNumber, sortCode);
if (!isValid) {
throw new Error('Invalid input');
}
// Just pass the object on through if things work.
return obj;
});