How to check if that data already exist in the database during update (Mongoose And Express)

后端 未结 8 1918
灰色年华
灰色年华 2020-12-05 00:28

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 som

8条回答
  •  执念已碎
    2020-12-05 00:49

    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!'
            }
          }
        });
    

提交回复
热议问题