Mig*_*nzo 25 validation mongoose node.js express
如何在mongoose中保存编辑后的数据之前进行验证?
例如,如果sample.name数据库中已存在,则用户将收到某种错误,类似于此,这是我的代码,如下所示
//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);
    });
  });
});
mr.*_*eze 57
通常你可以使用mongoose验证,但由于你需要一个异步结果(现有名称的db查询)和验证器不支持promises(从我能说的),你需要创建自己的函数并传递一个回调.这是一个例子:
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);
           }
       });
   } 
});
更新:更好的方法
预挂钩似乎是一个更自然的停止保存的地方:
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!"));
        }
    });
}) ;
更新2:异步自定义验证器
它看起来像mongoose现在支持异步自定义验证器,所以这可能是自然的解决方案:
    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!'
        }
      }
    });
继续使用示例@nfreeze的另一种方法是使用此验证方法:
UserModel.schema.path('name').validate(function (value, res) {
    UserModel.findOne({name: value}, 'id', function(err, user) {
        if (err) return res(err);
        if (user) return res(false);
        res(true);
    });
}, 'already exists');
| 归档时间: | 
 | 
| 查看次数: | 95227 次 | 
| 最近记录: |