【问题标题】:How To Make Joi Warning On Non-Existant property如何对不存在的属性发出 Joi 警告
【发布时间】:2022-11-27 03:46:59
【问题描述】:

如果特定元素不存在,我如何使用 Joi 抛出警告而不是错误?

我的代码:

const Joi = require('joi');

const schema = Joi.object({
    username: Joi.string()
        .alphanum()
        .min(3)
        .max(30)
        .required(),
    birth_year: Joi
        .number()
        .min(2000)
        .warn()
});

console.log({ error, warning, value } = schema.validate({ username: 'abc', birth_year: 1994 }));
console.log({ error, warning, value } = schema.validate({ username: 'abc'}));

当出生年份不符合我要求的最低要求时,我可以成功看到警告

'"birth_year" 必须大于或等于 2000'

但是,如果出生年份不存在,我也想警告。

目前我没有收到警告或错误。如果我将 .required() 添加到出生年份模式,如果出生年份不存在,它将出错。我试过这样做:

birth_year: Joi
        .number()
        .min(2000)
        .warn()
        .required()
        .warn()

然而,这会产生运行时错误,因为 .warn() 会终止架构选项。我也尝试将 .required 移动到第二个选项,但它再次出错,而不是警告。

【问题讨论】:

  • 曾经解决过这个问题吗?试图完成同样的事情。
  • 嘿@JonathanCorrin。我从来没有解决过这个问题,我不得不单独进行自定义检查以检查该字段是否存在

标签: javascript schema joi


【解决方案1】:

使用 warn() 和 validateAsync() 方法并将 warnings 选项设置为 true:

const schema = Joi.object({
          username: Joi.string()
                    .alphanum()
                    .min(3)
                    .max(30)
                    .required(),
          birth_year: Joi
                      .number()
                      .min(2000)
                      .warn()     // warning
                      .required()
});

现在您可以使用 async 函数中的 validateAsync() 方法验证它,如下所示:

(async function(){
    try {
       const { value, warning } = await schema.validateAsync({ username: 'abc', birth_year: 1994 }, { warnings: true });
    } catch(e) {
       console.log(e);
    }
})();

如果 birth_year 字段不存在,此代码将抛出错误;如果 birth_year 字段存在但不符合要求,则此代码将抛出警告。

请注意,warn() 将终止当前规则集,并且后面不能跟另一个规则选项。使用 rule() 应用多个规则选项。

更多信息:https://joi.dev/api/?v=17.7.0#anywarn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多