【问题标题】:How to allow any other key in Joi [duplicate]如何允许Joi中的任何其他键[重复]
【发布时间】:2018-09-28 13:46:07
【问题描述】:

我有一个简单的要求。我试图在互联网和文档上搜索,但失败了。
所以这就是我想要实现的目标:

我有一个架构:

const schema = Joi.object().keys({
  a: Joi.string().required(),
  b: Joi.string().required()
});

现在,如何配置它以允许对象中的任何其他键?

使用此模式,它只允许两个键 ab。如果我传递任何其他键,例如 c,它会抛出一个错误,指出不允许使用 c

【问题讨论】:

  • 这个问题似乎得到了很多意见,所以让我澄清一下:我已经接受了 Carsten 的答案,因为当时它是对我有用的解决方案,我的问题得到了更少的回答一个多小时。但这可能不是您的最佳解决方案。只需向下滚动并查看 Niels 的最高投票答案。尽管答案很干净,但我不会将其标记为已接受,因为这会损害 Carsten 的努力。

标签: javascript hapijs joi


【解决方案1】:

如果您想确保这些未知键是字符串,则可以使用 object.pattern(regex, schema) 添加未知键:

const schema = Joi.object().keys({
  a: Joi.string().required(),
  b: Joi.string().required()
}).pattern(/./, Joi.string());

对于所有密钥类型的一般通行证,请使用object.unknown(true)

const schema = Joi.object().keys({
  a: Joi.string().required(),
  b: Joi.string().required()
}).unknown(true);

【讨论】:

  • 使用.pattern(/./, Joi.any()) 做到了。 (因为也可以有嵌套对象)。谢谢!
  • 最好将@Niels Keurentjes 的答案标记为已接受的答案。这可能有效,但不应被提升为 goto 解决方案。
  • 再一次,这是允许未知的更具体的版本。此代码允许用户指定所有未知键必须是字符串。这在某些情况下非常有用,例如创建所有未知过滤器参数必须符合给定模式的 REST API 过滤器。
  • 我同意,没有理由对这个解决方案投反对票。 unknown(true) 选项将允许任何内容,但如果您只想允许特定键,则正则表达式模式是您的朋友。
【解决方案2】:

正确答案其实是用object.unknown(true)

const schema = Joi.object().keys({
  a: Joi.string().required(),
  b: Joi.string().required()
}).unknown(true);

【讨论】:

  • 简单直接的答案,不错的 +1 :)
  • 这应该是最好的答案。
  • true 参数不是必需的,因为它是默认值。仅使用 .unkown() 即可获得相同的效果。
  • 在编写验证方案时,我建议清晰而不是简洁。是的,该参数不是必需的,因为默认值,但明确提供它可以防止任何可能的意图混淆。
  • 选中的答案其实也不错。 Unknown true 将允许未知键,当然。但是,它不允许您指定未知数应该是什么类型。 “正确”的答案将强制所有未知数为字符串类型。这在某些情况下非常有用。
猜你喜欢
  • 2014-10-08
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多