How to do validations before saving the edited data in mongoose?
For example, if sample.name
already exists in the database, the user will receive a some sort of error, something like that, here's my code below
//Post: /sample/edit app.post(uri + '/edit', function (req, res, next) { Sample.findById(req.param('sid'), function (err, sample) { if (err) { return next(new Error(err)); } if (!sample) { return next(new Error('Invalid reference to sample information')); } // basic info sample.name = req.body.supplier.name; sample.tin = req.body.supplier.tin; // contact info sample.contact.email = req.body.supplier.contact.email; sample.contact.mobile = req.body.supplier.contact.mobile; sample.contact.landline = req.body.supplier.contact.landline; sample.contact.fax = req.body.supplier.contact.fax; // address info sample.address.street = req.body.supplier.address.street; sample.address.city = req.body.supplier.address.city; sample.address.state = req.body.supplier.address.state; sample.address.country = req.body.supplier.address.country; sample.address.zip = req.body.supplier.address.zip; sample.save(function (err) { if (err) { return next(new Error(err)); } res.redirect(uri + '/view/' + sample._id); }); }); });
You can use the Find operation in the MongoDB node. In the Query field you can enter your MongoDB query to search for the records.
When you create an instance of a Mongoose model using new , calling save() makes Mongoose insert a new document. If you load an existing document from the database and modify it, save() updates the existing document instead.
It just means that your new document will have a field with "done" as key and "false" boolean as value.
Mongoose has several built-in validators. All SchemaTypes have the built-in required validator. The required validator uses the SchemaType's checkRequired() function to determine if the value satisfies the required validator. Numbers have min and max validators.
Typically you could use mongoose validation but since you need an async result (db query for existing names) and validators don't support promises (from what I can tell), you will need to create your own function and pass a callback. Here is an example:
var mongoose = require('mongoose'), Schema = mongoose.Schema, ObjectId = Schema.ObjectId; mongoose.connect('mongodb://localhost/testDB'); var UserSchema = new Schema({ name: {type:String} }); var UserModel = mongoose.model('UserModel',UserSchema); function updateUser(user,cb){ UserModel.find({name : user.name}, function (err, docs) { if (docs.length){ cb('Name exists already',null); }else{ user.save(function(err){ cb(err,user); }); } }); } UserModel.findById(req.param('sid'),function(err,existingUser){ if (!err && existingUser){ existingUser.name = 'Kevin'; updateUser(existingUser,function(err2,user){ if (err2 || !user){ console.log('error updated user: ',err2); }else{ console.log('user updated: ',user); } }); } });
UPDATE: A better way
The pre hook seems to be a more natural place to stop the save:
UserSchema.pre('save', function (next) { var self = this; UserModel.find({name : self.name}, function (err, docs) { if (!docs.length){ next(); }else{ console.log('user exists: ',self.name); next(new Error("User exists!")); } }); }) ;
UPDATE 2: Async custom validators
It looks like mongoose supports async custom validators now so that would probably be the natural solution:
var userSchema = new Schema({ name: { type: String, validate: { validator: function(v, cb) { User.find({name: v}, function(err,docs){ cb(docs.length == 0); }); }, message: 'User already exists!' } } });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With