mongoosevalidation比赛条件?

我有一个叫做Application的模型:

var ApplicationSchema = new mongoose.Schema({ name : {type: String, validate: [uniqueName, 'Unique Name']}, dateCreated: Date, containers : [ContainerSchema] }); mongoose.model('Application', ApplicationSchema); var Application = database.model('Application'); 

它保存时会调用一个名为uniqueName的validation函数:

 function uniqueName(name) { console.log('In Unique Name function'); Application.find({}, function(error, documents) { for(var i = 0; i < documents.length; i++) { if(documents[i].name == name) { console.log('About to return false'); return false; } } }); return true; } 

稍后在代码中,我将一些数据放在模型中并保存:

 newApplication.name = request.body.name; newApplication.save(function(error) { console.log('Callback for save'); if(error) { console.log('error if statement'); response.statusCode = 409; response.end(); } console.log('Done with callback'); }); response.statusCode = 201; response.end(); 

当我用一个不唯一的名字来testing这个名字时,我得到了一个201响应,并且从我的terminal得到了下面的输出:

 In Unique Name function Callback for save Done with callback About to return false 

我做错了什么,或者这是一个真正的mongoose赛跑条件?

当你的validation器是asynchronous的(就像它在这里),它需要接受第二个参数,这个参数是一个callback函数,你必须调用true或false,这取决于validation是否通过。 所以:

 function uniqueName(name, callback) { Application.find({}, function(error, documents) { for(var i = 0; i < documents.length; i++) { if(documents[i].name == name) { return callback(false); } } return callback(true); } } 

但是,这不是非常有效的; 你应该:

过滤您的search,而不是获取所有文档并手动search它们。 例如

 Application.find({name: name} ... 

或甚至更好:

name上创build一个独特的索引,让mongo确保您的唯一性。 例如

 var ApplicationSchema = new mongoose.Schema({ name: {type: String, unique: true}, ...