当前位置: 首页 > 面试题库 >

如何在更新期间检查数据库中是否已存在数据(Mongoose And Express)

左丘兴生
2023-03-14
问题内容

将编辑后的数据保存在猫鼬中之前如何进行验证?

例如,如果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);
    });

  });
});

问题答案:

通常,您可以使用猫鼬验证,但由于需要异步结果(对现有名称的db查询)并且验证器不支持promise(据我所知),因此需要创建自己的函数并传递回调。这是一个例子:

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:异步自定义验证器

看起来猫鼬现在支持异步自定义验证器,因此这可能是自然的解决方案

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


 类似资料:
  • 问题内容: 建立连接后是否可以检查(MySQL)数据库是否存在。 我知道如何检查数据库中是否存在表,但是我需要检查数据库是否存在。如果没有,我必须调用另一段代码来创建它并填充它。 我知道所有这些听起来都不太优雅-这是一个快速又肮脏的应用程序。 问题答案: 如果您只想知道数据库是否存在,以免在尝试创建数据库时出错,只需使用(From here):

  • 我从sql db移到了Room。我不知道如何检查数据库中是否存在项目。如何使用Room编写这段代码? 我试图用这段代码来实现这一点,但总是得到FALSE返回

  • 问题内容: 我正在将实时数据库与Google的Firebase结合使用,并且正在尝试检查是否存在孩子。 我的数据库结构如下 我想检查room1是否存在。我尝试了以下方法: 在访问它时,返回该房间属性的JSON,但是我如何检查room()是否从那里开始呢? 评论是否需要任何澄清 问题答案:

  • 问题内容: 无法让Firebase识别已经输入的用户名。下面的代码显示我正在尝试将输入的用户名与数据库的DataSnapshot进行比较。该代码似乎没有拾取输入的用户名。代码是否错误? 在按钮上单击,我希望能够将用户引导到该错误,并且在该错误唯一之前,不应将该页面推送到下一个活动。 JSON树(如果有帮助) 问题答案: 是异步操作。设置回调后,代码将继续运行,而您尚未获取任何用户名。到您检查mSw

  • 问题内容: 我正在尝试制作简单的Java代码,以检查MySQL DB中是否存在表和/或列。我应该使用Java代码进行检查还是生成一个SQL查询字符串并执行以进行检查? 编辑- @ aleroot- 我尝试使用您的代码,如下所示。运行以下代码时,我看不到任何表或列。我只看到这个 我的数据库有很多数据库,表和列。我不知道为什么该程序可以正常工作。 问题答案: 要检查表是否存在,可以按以下方式使用Dat

  • 问题内容: 我是通过Android(Java)刚接触Firebase的,并且想知道如何检查用户是否已存在以下格式的数据库中: 例如,按下按钮后,我想检查Firebase以查看用户名“ Michael”是否存在(对象michael中的第一级michael-而不是“ michael”。 谢谢 问题答案: 使用方法或onDataChange中的SingleValueEvent