如何动态复制 Joi 模式的一部分以在本地模式中使用?
How to dynamically copy part of a Joi schema for use within a local schema?
我正在通过一个项目来学习在 React 中使用 Joi 库。
讲师使用的是旧的、已弃用的库版本,因此我正在努力转换讲师版本以使用新语法。我需要为架构传递一个 Joi 对象,并让该对象调用以我正在验证的对象作为第一个参数进行验证。
我无法弄清楚如何动态调用 Joi 对象的值以传递到新架构中。
这是我目前使用 Joi v16 的代码
schema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.required()
.label("Username"),
password: Joi.string()
.min(5)
.required()
.label("Password")
});
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const localSchema = Joi.object({ [name]: "" }); //The copied schema segment goes here in place of the empty string.
const { error } = localSchema.validate(obj);
return error ? error.details[0].message : null;
};
我的直觉反应是 "feels" 错了,好像我应该以更简单的方式来做这件事...但我不确定该怎么做才能继续前进。
为了比较这里是用 Joi v13 编写的教师示例。
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const schema = { [name]: this.schema[name] };
Joi.validate(obj, schema);
return error ? error.details[0].message : null;
};
没关系,我自己找到了答案!
一开始我没有将模式声明为 Joi.object,而是将其声明为标准 JS 对象。
然后,在我的方法中,我创建了一个本地常量来过滤它然后将其包装到 Joi.object 中并继续进行验证。
schema = {
username: Joi.string()
.alphanum()
.min(3)
.required()
.label("Username"),
password: Joi.string()
.min(5)
.required()
.label("Password")
};
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const localSchema = Joi.object({ [name]: this.schema[name] });
const { error } = localSchema.validate(obj);
return error ? error.details[0].message : null;
};
schemaMap = {
username: Joi.string()
.alphanum()
.min(3)
.required()
.label("Username"),
password: Joi.string()
.min(5)
.required()
.label("Password")
};
schema = Joi.object(this.schemaMap)
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const localSchema = Joi.object({ [name]: this.schemaMap[name] });
const { error } = localSchema.validate(obj);
return error ? error.details[0].message : null;
};
我正在通过一个项目来学习在 React 中使用 Joi 库。 讲师使用的是旧的、已弃用的库版本,因此我正在努力转换讲师版本以使用新语法。我需要为架构传递一个 Joi 对象,并让该对象调用以我正在验证的对象作为第一个参数进行验证。
我无法弄清楚如何动态调用 Joi 对象的值以传递到新架构中。
这是我目前使用 Joi v16 的代码
schema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.required()
.label("Username"),
password: Joi.string()
.min(5)
.required()
.label("Password")
});
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const localSchema = Joi.object({ [name]: "" }); //The copied schema segment goes here in place of the empty string.
const { error } = localSchema.validate(obj);
return error ? error.details[0].message : null;
};
我的直觉反应是 "feels" 错了,好像我应该以更简单的方式来做这件事...但我不确定该怎么做才能继续前进。
为了比较这里是用 Joi v13 编写的教师示例。
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const schema = { [name]: this.schema[name] };
Joi.validate(obj, schema);
return error ? error.details[0].message : null;
};
没关系,我自己找到了答案!
一开始我没有将模式声明为 Joi.object,而是将其声明为标准 JS 对象。 然后,在我的方法中,我创建了一个本地常量来过滤它然后将其包装到 Joi.object 中并继续进行验证。
schema = {
username: Joi.string()
.alphanum()
.min(3)
.required()
.label("Username"),
password: Joi.string()
.min(5)
.required()
.label("Password")
};
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const localSchema = Joi.object({ [name]: this.schema[name] });
const { error } = localSchema.validate(obj);
return error ? error.details[0].message : null;
};
schemaMap = {
username: Joi.string()
.alphanum()
.min(3)
.required()
.label("Username"),
password: Joi.string()
.min(5)
.required()
.label("Password")
};
schema = Joi.object(this.schemaMap)
validateProperty = ({ name, value }) => {
const obj = { [name]: value };
const localSchema = Joi.object({ [name]: this.schemaMap[name] });
const { error } = localSchema.validate(obj);
return error ? error.details[0].message : null;
};