如何允许Joi中的任何其他键[重复]

Posted

技术标签:

【中文标题】如何允许Joi中的任何其他键[重复]【英文标题】:How to allow any other key in Joi [duplicate] 【发布时间】: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 的努力。 【参考方案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()) 做到了。 (因为也可以有嵌套对象)。谢谢! github.com/hapijs/joi/blob/master/API.md#objectunknownallow 可能更容易 最好将@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 将允许未知键,当然。但是,它不允许您指定未知数应该是什么类型。 “正确”的答案将强制所有未知数为字符串类型。这在某些情况下非常有用。

以上是关于如何允许Joi中的任何其他键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JOI:允许数组中的空值

很菜的数据库问题,主键的值允许重复吗?外键啥作用?

hapijs joi 验证,只验证一个字段并允许任何字段

SQL Server中如何不允许列重复?

面试复习之数据库

面试复习之数据库