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