【问题标题】:how to access/extract a schema from an already defined schema object in Joi?如何从 Joi 中已定义的模式对象中访问/提取模式?
【发布时间】:2021-03-11 20:31:54
【问题描述】:

我已经定义了这个架构。

    schema = Joi.object({
        username: Joi.string().min(5).max(32).required().label('Username'),
        password: Joi.string().min(8).max(50).required().label('Password')
    });

我知道我需要同时传递有效的用户名和密码值才能避免错误。

但是,我一次只需要针对此架构验证一个字段。 这意味着,如果我传递了一个有效的用户名,我希望这个模式不返回任何错误。

这是我所做的:

validateOneField(name, value){
    // create an object  dynamically
    const obj = { [name] : value };
    // here I need to get the schema for either username or password depending upon name argument.
    // how can I create a schema dynamically here?
    // example:
    const schema = Joi.object({ this.schema[name] }); // I know this won't work!
    // and validate only single value
    const { error } = schema.validate(obj);
    console.log(error);
}

还有其他方法可以访问架构,例如:this.schema[username] 或 this.schema[password]?

提前谢谢你!

【问题讨论】:

  • 在什么情况下应该验证密码?您能否提供一些您的架构应该通过和失败的示例?
  • 我正在验证“onChange”事件的输入字段!此评论是否满足您的好奇心?

标签: javascript ecmascript-6 joi


【解决方案1】:

你可以使用extract方法获取你想要的规则

validateOneField(name, value){
    const rule = this.schema.extract(name);
    const { error } = rule.validate(value);
    console.log(error);
}

【讨论】:

    【解决方案2】:

    在 Gabriele Petrioli 的回答的帮助下,我得以完成这项工作。

    代码:

        validateProperty = ({name, value}) => {
            const obj = { [name] : value };
            const rule = this.schema.extract(name);
            const schema = Joi.object({ [name] : rule});
            const { error } = schema.validate(obj);
            return (!error) ? null : error.details[0].message;
        };
    

    谢谢你们!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2021-05-21
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多