Mongoose 验证:必需:false,验证:正则表达式,空值问题

Posted

技术标签:

【中文标题】Mongoose 验证:必需:false,验证:正则表达式,空值问题【英文标题】:Mongoose validation: required : false, validate : regex, issues with empty values 【发布时间】:2014-03-17 13:15:47 【问题描述】:

我从 Mongoose 验证中收到此消息:

'路径电话的验证器失败,值为``'

这不应该发生,因为不需要电话。

这是我的模型架构:

var user = new Schema(
 
    _id      :  type: String, required: true ,
    name     :  type: String, required: true,
    phone    :  type: String, required: false, validate: /^\d10$/ ,
    password :  type: String ,
    added    :  type: Date,    default: Date.now ,
,
collection : 'users'
);

当我使用 required: false 并设置 validate 属性时,mongoose 的验证似乎失败了。 如果我将其更改为:

phone    :  type: String, required: false,

一切正常,这是为什么呢? 我做错了什么?

【问题讨论】:

【参考方案1】:

我认为您的正则表达式在空字符串上的验证失败,在这种情况下应该是有效的,因为这个字段不是必需的。你为什么不试试这个正则表达式:

/^$|^\d10$/ 

这将匹配一个空字符串或 10 位数字。

【讨论】:

其实我不希望猫鼬存储一个空值,它根本不应该存储,也不会触发验证错误 那你为什么不把电话字段设为必填? 我不希望它是必需的,它是一个可选字段,用户不必填写它,但如果他们确实提供了电话,那么我希望猫鼬验证它,确实这有意义吗?【参考方案2】:

您可以尝试使用自定义验证器,因为它们仅在给定键上有值时触发,因为自定义验证的键选择是通过 path() 完成的:

var user = new Schema(

  // ...
  phone    :  type: String , // using default - required:false
  // ...

);

// Custom validation
user.path('phone').validate(function (value) 

  // Your validation code here, should return bool

, 'Some error message');

看看这个问题:Why Mongoose doesn't validate empty document?

如果验证失败,这也将有效地防止文档被持久化到数据库中,除非您相应地处理错误。

BonusTip: 尝试以简单的方式处理自定义验证,例如尽量避免循环,并避免使用 lodash 或 underscore for in 之类的库我的经验我发现,在处理大量事务时,这些可能会产生巨大的性能成本。

【讨论】:

【参考方案3】:

您可以简单地检查输入的值是否存在(不为空或未定义)。如果存在,则测试正则表达式:

var user = new Schema(
 
    _id      :  type: String, required: true ,
    name     :  type: String, required: true,
    phone    :  type: String,/*not required by default**/ 
                 validate: 
                     validator: function(v) 
                         var re = /^\d10$/;
                         return (!v || !v.trim().length) || re.test(v)
                     ,
                     message: 'Provided phone number is invalid.'
                 
    ,
    password :  type: String ,
    added    :  type: Date,    default: Date.now ,
,
collection : 'users'
);

【讨论】:

以上是关于Mongoose 验证:必需:false,验证:正则表达式,空值问题的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 将严格设置为 false 禁用验证

Mongoose 验证错误:架构配置无效

“未检测到侦听器”验证错误 Mongoose 和 Mocha

为啥 Mongoose 不验证空文档?

为啥 Mongoose 不验证空文档?

MVC 验证 - [必需] 属性抛出 jquery JSON.parse 异常