繁体   English   中英

如何动态复制 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;
  };

我的直觉反应是这种“感觉”是错误的,就像我应该以更简单的方式来做这件事……但我不知道该怎么做才能继续前进。

为了比较,这里是用 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;
  };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM