MongoDB - 处理错误事件

时间:2017-04-11 08:36:21

标签: node.js mongodb express

我将图片上传到mongoDb时有自定义验证。原始名称应该是唯一的。如果它通过验证,代码将正常运行。但如果失败,就会产生错误。它表示带有2个参数的自定义验证器在mongoose> = 4.9.0中已弃用。有没有其他方法来验证原始名称的唯一性?还是一种捕捉错误的方法?请帮忙。

router.post('/upload',function(req,res){

    Item.schema.path('originalname').validate(function(value, done) {
    Item.findOne({originalname: value}, function(err, name) {
      if (err) return done(false);
      if (name) return done(false);

      done(true);
    });
  });

    upload(req,res,function(err, file) {
        if(err){
          throw err;
        }
        else{
          var path = req.file.path;
          var originalname = req.file.originalname;
          var username = req.body.username;

          var newItem = new Item({
            username: username,
            path: path,
            originalname: originalname
          });

          Item.createItem(newItem, function(err, item){
            if(err) throw err;
            console.log(item);
          });

          console.error('saved img to mongo');
          req.flash('success_msg', 'File uploaded');
          res.redirect('/users/welcome');

        }
    });
});

模型

var ItemSchema = mongoose.Schema({
username: {
  type: String,
  index: true
},
 path: {
   type: String
 },
 originalname: {
   type: String
 }
});

var Item = module.exports = mongoose.model('Item',ItemSchema);

module.exports.createItem = function(newItem, callback){
  newItem.save(callback);
}

2 个答案:

答案 0 :(得分:0)

您可以为该字段提供唯一性,例如: -

var ItemSchema = mongoose.Schema({
username: {
  type: String,
  index: true
},
 path: {
   type: String
 },
 originalname: {
   type: String,
   unique:true    // this string will be unique all over the database
 }
});

var Item = module.exports = mongoose.model('Item',ItemSchema);

module.exports.createItem = function(newItem, callback){
  newItem.save(callback);
}

答案 1 :(得分:0)

要在保存到db之前验证唯一性,可以尝试findOne使用tour filename:

router.post('/upload',function(req,res){

Item.findOne({originalname: req.file.originalname}, function(err, name) {
       if (err) return done(false); // errors
       if (name) return done(false); // check for existence of item here 

       done(true);
    });
});

如果findOne函数没有响应任何数据,则意味着集合中没有相同原始名称的文档,您可以继续将文档添加到集合中