【问题标题】:Joi require unkown fieldsJoi 需要未知字段
【发布时间】:2020-10-29 12:22:29
【问题描述】:

我正在验证一个 GET 请求查询字符串(使用 express-joi-validation)并要求用户传递至少一个未在架构中直接指定的额外键值对。

我尝试验证如下:

const schema = Joi
    .object({
        requiredKey: Joi.string().required()
        knownExtraKey: Joi.boolean()
    })
    .pattern(/^/, Joi.string().required())

schema.validate({requiredKey: 'A'}) // valid but shouldn't be
schema.validate({requiredKey: 'A', name: "paul"}) // valid

【问题讨论】:

  • 你能分享你想要验证的对象吗?
  • 从字面上看,任何对象都应该是有效的。我遇到的问题是,当什么都不通过时它不会抛出无效。我刚刚编辑了提到 express-joi-validation 的问题,这是我用来将 joi 验证器添加到 Express 端点的库
  • 您确定.pattern() 应该采用这样的两个参数吗?如果您在文档中搜索“嵌套”,您会看到属性约束是在传递给keys({}) 的对象中定义的。我从未使用过 Joi,所以这只是我快速阅读的其他内容,您可以尝试一下。
  • 如果我将示例修改为 .pattern(/^/, Joi.string().valid('onlythis')) 并验证对象 {a : 1},我将按预期收到验证错误,因此我相信我对 .pattern 的使用是正确的

标签: javascript validation joi


【解决方案1】:

如果您想要至少一个属性:

joi版本17.2.1

说明:

您需要使用以下公式指定最小键 object().min()所需属性的数量 + 1。在下面的示例中,如果您验证具有 3 个或 4 个属性的对象,验证不会返回任何错误。

const Joi = require('joi');

const schema = Joi.object().keys({
  one: Joi.string().required(),
  two: Joi.string().required(),
  three: Joi.string(),
  four: Joi.string(),
}).min(3);

// works
const data1 = {
  one: 'one',
  two: 'two',
  three: 'three',
};
console.log(schema.validate(data1).error);

// works
const data2 = {
  one: 'one',
  two: 'two',
  three: 'three',
  four: 'four',
};
console.log(schema.validate(data2).error);

// fails
const data3 = {
  one: 'one',
  two: 'two',
};
console.log(schema.validate(data3).error)

【讨论】:

  • 感谢您的回答。原来我可能把我的问题简化得太多了!在我的实际项目中,对象模式中也有一组定义的可选字段。所以我想我想要验证的是至少 1 个额外的密钥
  • 我更新了我的答案。这对你有用吗?如果是,请同时编辑您的问题。
  • 问题已更新。我不确定 .min() 是否会起作用,因为这完全取决于提供的未知键的数量,而不是键的总数。
  • 我不完全理解你的问题。你有一组预定义的required() 属性,你有一些known 可选属性,你有一些unknown 可选属性。对吗?
  • 正确,至少需要一个未知属性
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多