Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose findOneAndUpdate and runValidators not working

I am having issues trying to get the 'runValidators' option to work. My user schema has an email field that has required set to true but each time a new user gets added to the database (using the 'upsert' option) and the email field is empty it does not complain:

 var userSchema = new mongoose.Schema({
   facebookId: {type: Number, required: true},
   activated: {type: Boolean, required: true, default: false},
   email: {type: String, required: true}
});

findOneAndUpdate code:

model.user.user.findOneAndUpdate(
      {facebookId: request.params.facebookId},
      {
          $setOnInsert: {
              facebookId: request.params.facebookId,
              email: request.payload.email,
          }
      },
      {upsert: true, 
       new: true, 
       runValidators: true, 
       setDefaultsOnInsert: true
      }, function (err, user) {
          if (err) {
              console.log(err);
              return reply(boom.badRequest(authError));
          }
          return reply(user);
      });

I have no idea what I am doing wrong, I just followed the docs: http://mongoosejs.com/docs/validation.html

In the docs is says the following:

Note that in mongoose 4.x, update validators only run on $set and $unset operations. For instance, the below update will succeed, regardless of the value of number.

I replaced the $setOnInsert with $set but had the same result.

like image 528
Jdruwe Avatar asked Jun 28 '15 16:06

Jdruwe


3 Answers

required validators only fail when you try to explicitly $unset the key.

This makes no sense to me but it's what the docs say.

like image 151
kmcurry Avatar answered Oct 19 '22 21:10

kmcurry


use this plugin: mongoose-unique-validator

When using methods like findOneAndUpdate you will need to pass this configuration object:

{ runValidators: true, context: 'query' }

ie.

User.findOneAndUpdate(
  { email: '[email protected]' },
  { email: '[email protected]' },
  { runValidators: true, context: 'query' },
  function(err) {
    // ...
}
like image 5
Isaac Pak Avatar answered Oct 19 '22 23:10

Isaac Pak


In mongoose do same thing in two step.

  1. Find the result using findOne() method.
  2. Add fields and save document using Model.save().

This will update your document.

like image 4
yojna Avatar answered Oct 19 '22 21:10

yojna