我想在mongoose模式验证规则中构建“minLength”和“maxLength”,目前的解决方案是:
var blogSchema = new Schema({
title: { required: true, type: String }
});
blogSchema.path('title').validate(function(value) {
if (value.length < 8 || value.length > 32) return next(new Error('length'));
});
但是我认为只需添加自定义架构规则就可以简化:
var blogSchema = new Schema({
title: {
type: String,
required: true,
minLength: 8,
maxLength: 32
}
});
我怎么能这样做,这甚至可能吗?
答案 0 :(得分:10)
查看库mongoose-validator。它集成了node-validator库,以便在mongoose模式中使用,其方式与您描述的方式非常相似。
具体而言,node-validator len 或 min 和 max 方法应该提供您需要的逻辑。
尝试:
var validate = require('mongoose-validator').validate;
var blogSchema = new Schema({
title: {
type: String,
required: true,
validate: validate('len', 8, 32)
}
});
答案 1 :(得分:5)
现在存在maxlength和minlength。您的代码应该如下工作。
var mongoose = require('mongoose');
var blogSchema = new mongoose.Schema({
title: {
type: String,
required: true,
minLength: 8,
maxLength: 32
}
});
答案 2 :(得分:3)
我有相同的功能请求。不知道,为什么mongoose不提供String类型的最小/最大值。你可以扩展mongoose的字符串模式类型(我刚刚从数字模式类型中复制了min / max函数并将其调整为字符串 - 对我的项目工作正常)。确保在创建模式/模型之前调用补丁:
var mongoose = require('mongoose');
var SchemaString = mongoose.SchemaTypes.String;
SchemaString.prototype.min = function (value) {
if (this.minValidator) {
this.validators = this.validators.filter(function(v){
return v[1] != 'min';
});
}
if (value != null) {
this.validators.push([this.minValidator = function(v) {
if ('undefined' !== typeof v)
return v.length >= value;
}, 'min']);
}
return this;
};
SchemaString.prototype.max = function (value) {
if (this.maxValidator) {
this.validators = this.validators.filter(function(v){
return v[1] != 'max';
});
}
if (value != null) {
this.validators.push([this.maxValidator = function(v) {
if ('undefined' !== typeof v)
return v.length <= value;
}, 'max']);
}
return this;
};
PS:由于这个补丁使用了一些mongoose的内部变量,你应该为你的模型编写单元测试,以便注意补丁何时被破坏。
答案 3 :(得分:0)
最小和最大已更改
var breakfastSchema = new Schema({
eggs: {
type: Number,
min: [6, 'Too few eggs'],
max: 12
},
bacon: {
type: Number,
required: [true, 'Why no bacon?']
},
drink: {
type: String,
enum: ['Coffee', 'Tea'],
required: function() {
return this.bacon > 3;
}
}
});