如何允许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()
);
现在,如何配置它以允许对象中的任何其他键?
使用此模式,它只允许两个键 a
和 b
。如果我传递任何其他键,例如 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中的任何其他键[重复]的主要内容,如果未能解决你的问题,请参考以下文章