JOI 电子邮件验证

Posted

技术标签:

【中文标题】JOI 电子邮件验证【英文标题】:JOI email validation 【发布时间】:2020-01-18 04:57:14 【问题描述】:

我使用 Joi 库作为我的 CRA 项目的独立验证器,但是在触发 email() 验证器时,我遇到了神秘错误

Uncaught Error: Built-in TLD list disabled

【问题讨论】:

【参考方案1】:

如果您使用的是 joi 16.1.1,此版本中有一些更新,您可以在此处查看更多信息 docs。我想这会对你有所帮助

email: Joi.string().email( minDomainSegments: 2, tlds:  allow: ['com', 'net']  )

【讨论】:

【参考方案2】:

从 16.0.0 版本开始,joi 带有一个预构建的缩小版本,用于客户端开发。

大概是为了节省空间,Joi 的浏览器版本不包含默认的 TLD 列表。

(请参阅 Joi 存储库中的这些发行说明:https://github.com/hapijs/joi/issues/2037)

【讨论】:

【参考方案3】:

来自 Joi documentation:

默认情况下,TLD 必须是 IANA 注册表中列出的有效名称。要禁用验证,请将 tlds 设置为 false。要自定义 TLD 的验证方式,请设置以下选项之一:

允许 - 之一:

true 以使用 IANA 注册 TLD 列表。这是默认设置 价值。 false 允许拒绝列表中未列出的任何 TLD(如果存在)。 允许的 TLD 的集合或数组。不能一起用 拒绝。

禁用针对 IANA 接受列表的 TLD 验证:

email: Joi.string().email( tlds:  allow: false  );

这应该会禁用验证并允许您接受任何 TLD,即使它没有 IANA 注册。

【讨论】:

如果我们将“allow”设置为 true,那么它会抛出错误 Uncaught Error: Built-in TLD list disabled 即使我们只说电子邮件:Joi.string().email();然后它也抛出错误错误:内置 TLD 列表已禁用【参考方案4】:

在 v16.0.0 的文档中:“浏览器构建不包括 TLD 电子邮件验证” 所以,我猜你必须在浏览器上将其设置为 false

【讨论】:

【参考方案5】:

Joi 现在在其 package.json ('browser') 中有一个指令,它指示 Webpack 使用不包含 TLD 列表的精简版 Joi。

要继续使用完整版的 Joi(具有有效的 TLD 验证),您需要覆盖 webpack 配置。

首先是install Craco,它使您能够覆盖 CRA 的 webpack 配置。

然后将以下内容添加到您的 craco.config.js:

const path = require('path');

module.exports = 
  webpack: 
    configure: 
      resolve: 
        alias: 
          // ignore the cut down browser distribution that 
          // joi's package.json steers webpack to
          joi: path.resolve(__dirname, 'node_modules/joi/lib/index.js'),
        ,
      ,
    ,
  ,
;

【讨论】:

以上是关于JOI 电子邮件验证的主要内容,如果未能解决你的问题,请参考以下文章

Joi 验证多个条件

Joi验证忽略嵌套键

数组的Joi验证

hapi route joi 验证密码确认

如何在 Joi 字符串验证中使用枚举值

Joi 验证正则表达式或模式