从 Joi 模式中提取类型和约束
Extracting a type and constraint from a Joi schema
如果我有架构:
const schema = Joi.object({
title: Joi.string().trim().alphanum().min(3).max(50).required().messages({
"string.base": `Must be text`,
"string.empty": `Cannot be empty`,
"string.min": `Must be > 3`,
"string.max": `Must be < than 50`,
"any.required": `Required`,
}),
... // more key/constraints
});
是否可以访问 key/value 对 Joi 对象以便在函数中使用它来验证单个字段?
例如,我可以这样做:
const validateProperty = ({ value, name }, schema) => {
const { error } = schema[name].validate(value);
if(!error) return null;
return error.details[0].message;
};
validateProperty({value:valueToValidate, name:'title'}, schema)
其中 name
是架构中约束的键?它只会节省我为整个表单编写模式,然后将每个单独的约束重写为它自己的模式,以便在需要时验证单个字段(例如 onBlur)
原来 .extract()
here 是正确的答案,这只是我实现中的一个错误:
const validateProperty = ({ value, name }, schema) => {
const { error } = schema.extract(name).validate(value);
if(!error) return null;
return error.details[0].message;
};
const validate = (data, schema) => {
const options = { abortEarly: false }
const { error } = schema.validate(data, options);
if(!error) return null;
const errors = {};
error.details.forEach(error => {
errors[error.path[0]] = error.message
})
return errors;
}
validate(data, schema)
validateProperty({ value: valueToValidate, schema })
如果我有架构:
const schema = Joi.object({
title: Joi.string().trim().alphanum().min(3).max(50).required().messages({
"string.base": `Must be text`,
"string.empty": `Cannot be empty`,
"string.min": `Must be > 3`,
"string.max": `Must be < than 50`,
"any.required": `Required`,
}),
... // more key/constraints
});
是否可以访问 key/value 对 Joi 对象以便在函数中使用它来验证单个字段?
例如,我可以这样做:
const validateProperty = ({ value, name }, schema) => {
const { error } = schema[name].validate(value);
if(!error) return null;
return error.details[0].message;
};
validateProperty({value:valueToValidate, name:'title'}, schema)
其中 name
是架构中约束的键?它只会节省我为整个表单编写模式,然后将每个单独的约束重写为它自己的模式,以便在需要时验证单个字段(例如 onBlur)
原来 .extract()
here 是正确的答案,这只是我实现中的一个错误:
const validateProperty = ({ value, name }, schema) => {
const { error } = schema.extract(name).validate(value);
if(!error) return null;
return error.details[0].message;
};
const validate = (data, schema) => {
const options = { abortEarly: false }
const { error } = schema.validate(data, options);
if(!error) return null;
const errors = {};
error.details.forEach(error => {
errors[error.path[0]] = error.message
})
return errors;
}
validate(data, schema)
validateProperty({ value: valueToValidate, schema })