为啥JOI比AJV更受欢迎?

Posted

技术标签:

【中文标题】为啥JOI比AJV更受欢迎?【英文标题】:Why is JOI more popular than AJV?为什么JOI比AJV更受欢迎? 【发布时间】:2019-06-11 05:12:37 【问题描述】:

我正在决定一个可用于客户端和服务器端验证的验证库。我一直在比较 JOI (+ joi-browser) 和 AJV。

据我了解,JOI 和 AJV 可以完成同样的事情。 AJV 甚至可以执行 JOI 无法执行的异步验证。似乎 AJV 还验证了用 standardized format 编写的 JSON 模式,这很方便,但它不像 JOI 那样对开发人员友好。

JOI 的明星和贡献者数量是AJV 的两倍多。

为什么 JOI 的受欢迎程度是 AJV 的两倍?

【问题讨论】:

【参考方案1】:

AJV 和 Joi 的重要区别在于 AJV 是 JSON Schema 验证器,而 Joi 是 javascript 验证器。 JSON Schema 是跨平台的,而 Joi 仅适用于 JavaScript。因此,这不是 AJV 和 Joi 之间的选择,而是 JSON Schema 和 Joi 之间的选择。

每种方法都有其权衡取舍,因此您选择哪种方法在很大程度上取决于您的具体情况。

AJV/JSON 架构

您从 JSON Schema 获得的最大优势在于它是跨平台的。 JSON Schema 验证器实现存在于每种主要的编程语言中。无论您选择哪种语言,您都可以在前端和后端使用相同的 JSON Schema,并获得一致的验证结果。一次编写,随处验证。

缺点是因为它是跨平台的,所以它的功能也受到一定的限制。它故意保持足够简单,以便用任何编程语言实现都不会太困难。因为 JSON Schema 不是一种成熟的编程语言,所以它的功能有限。

如果您在后端使用 JavaScript 以外的其他东西,或者您的应用是可以被任意数量的任意语言的任意数量的应用使用的公共 API,则您可以选择 AJV/JSON Schema。

乔伊

Joi 的最大优势在于它的可用性。它易于使用、易于扩展,并且具有 JavaScript 的全部功能。

缺点是,如果您想在前端在后端重用验证逻辑,后端语言的唯一选择是节点。

如果您将 JavaScript 用于前端和后端,并且不期望您需要支持的非 JavaScript 客户端,您可能会选择 Joi。这是一个相当狭窄的情况,但如果是你的情况,你可能会得到比 AJV/JSON Schema 更多的输出或 Joi。

人气

Github 明星并不是衡量受欢迎程度的重要指标。如果您查看 npm 每日下载量,您会看到一个非常不同的故事(AJV:18.9M,Joi:2.2M)。 JSON Schema 使用更广泛,因为它是跨平台的。 AJV 只是一种语言的一种实现。但是,如果您的开发堆栈适合 Joi 的特定利基,那么它可能是比 JSON Schema 更好的选择。

【讨论】:

@Jason 谢谢你,非常有用!您提到 AJV/JSON Schema 的功能有限,您能澄清一下您的意思吗?据我了解,在针对模式验证对象时,您可以使用 AJV(JSON 模式)和 Joi(将 JSON 模式转换为 Joi 模式)完成许多相同的事情。由于 AJV 和 Joi 都具有创建自定义验证器、执行条件和嵌套验证以及所有标准验证功能的能力。 @Jason 另外,当您说“如果您使用的不是 JavaScript,您可能会选择 AJV/JSON 模式”AJV 是 Javascript 的 JSON 模式验证器,所以我认为这种说法具有误导性。我认为您指的是验证json schemas in any language 的能力。对吗? 回复:JSON 架构限制。 AJV 通过自定义功能和自定义插件解决了大部分这些限制,但是当您使用这些自定义功能时,您会失去与其他 JSON Schema 库的互操作性,因此首先会失去选择 JSON Schema 的全部意义。 我将举三个示例,说明您无法使用 JSON Schema 做的事情。 (1) 您不能将一个值与另一个值进行比较。您不能强制要求 #/minWeight 小于 #/maxWeight。 (2) 你不能比较日期。 JSON Schema 仅识别 JSON 类型。这不包括日期。日期表示为字符串。因此,您不能强制规定最小或最大日期。 (3) 不能引用外部源,例如数据库或 Web 服务。在社交媒体应用中,当您将朋友添加到您的网络时,您可能希望强制添加的朋友确实存在于您的系统中。 回复:“误导性陈述”。抱歉,这确实令人困惑。是的,我指的是能够以任何语言验证 JSON 模式。

以上是关于为啥JOI比AJV更受欢迎?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 NodeJs 开发中 Mongodb 比 MySql 更受欢迎? [关闭]

在 C 系列中,为啥在循环中“小于或等于”比“小于”符号更受欢迎? [关闭]

为啥 BLToolkit 没有更受欢迎? [关闭]

Mockito 比 EasyMock 更受欢迎? [关闭]

为什么rwlock比linux内核中的seqlock更受欢迎? [关闭]

11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?