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,验证:正则表达式,空值问题的主要内容,如果未能解决你的问题,请参考以下文章