node.js - Mongoose Validation Race Condition? -
i have model called 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'); it calls validation function called uniquename when saves:
function uniquename(name) { console.log('in unique name function'); application.find({}, function(error, documents) { for(var = 0; < documents.length; i++) { if(documents[i].name == name) { console.log('about return false'); return false; } } }); return true; } later on in code put data in model , save it:
newapplication.name = request.body.name; newapplication.save(function(error) { console.log('callback save'); if(error) { console.log('error if statement'); response.statuscode = 409; response.end(); } console.log('done callback'); }); response.statuscode = 201; response.end(); when test name not unique, 201 response , following output terminal:
in unique name function callback save done callback return false am doing wrong, or race condition in mongoose?
when validator asynchronous (as here) needs accept second parameter callback must call true or false, depending on whether validation passed. so:
function uniquename(name, callback) { application.find({}, function(error, documents) { for(var = 0; < documents.length; i++) { if(documents[i].name == name) { return callback(false); } } return callback(true); } } however, not efficient; should either:
filter find instead of getting docs , manually searching them. e.g.
application.find({name: name} ... or better:
create unique index on name , let mongo ensure uniqueness you. e.g.
var applicationschema = new mongoose.schema({ name: {type: string, unique: true}, ...
Comments
Post a Comment