我会使用统一的方法来假设用户输入来验证我的模式,因此不仅在save / update上应用内置验证,而且还在find()等上应用。
var User = mongoose.model("User", new Schema({
name: {type: String, minlength: 5, maxlength: 128, required: true, unique: true});
}));
我想要的是每次在使用mongoose运行查询之前运行验证器,以确保用户输入符合全局架构规则。
在我的路线中有类似的东西:
var username = $.get["username"], //An input from GET querystring
User = mongoose.model("User");
User.validate({name: username}, function(err) {
if (err) return console.log("not valid input"); //i.e. too short
//run query if valid
});
是否有插件(假设我没有使用Express)或者其他已经包含在mongoose中?
答案 0 :(得分:1)
文档:http://mongoosejs.com/docs/validation.html
默认情况下,它在mongoose中受支持。如果您在每次保存操作之前寻找通用验证,则可以指定要验证的字段path
和验证validate(function(valueEntered, howToRespond)
。如果未通过验证,则将抛出错误,如下例所示。
示例:为方便起见,使用蓝鸟。以下代码段会在每次保存操作之前验证电子邮件。
var mongoose = require('bluebird').promisifyAll(require('mongoose'));
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String,
email: {
type: String,
lowercase: true
},
password: String,
});
UserSchema
.path('email')
.validate(function(value, respond) {
var self = this;
return this.constructor.findOneAsync({ email: value })
.then(function(user) {
if (user) {
if (self.id === user.id) {
return respond(true);
}
return respond(false);
}
return respond(true);
})
.catch(function(err) {
throw err;
});
}, 'The specified email address is already in use.');