2017-04-11 10 views
0

イメージをmongoDbにアップロードするときにカスタム検証があります。元の名前は一意である必要があります。検証に合格すると、コードは正常に実行されます。しかし、失敗すると、エラーが発生します。 2つの引数を取るカスタムバリデーターは、mongoose> = 4.9.0では非推奨となっています。元の名前の一意性を検証する別の方法はありますか?またはエラーをキャッチする方法?助けてください。MongoDB - ハンドルエラーイベント

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

答えて

0

: - DBに保存する前に一意性を検証するために

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); 
} 
+0

エラーをキャッチする方法は? –

+0

'.validate'を使用している間に値がコミットしているかどうかをチェックします – hardy

0

、あなたはツアーのファイル名でfindOneに試すことができます。

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関数が何らかのデータで応答しなかった場合は、同じ元の名前のコレクションに文書がなく、コレクションに文書を追加することができます。

+0

私はすでにそれを修正しました。とにかくありがとう。 :) –

+0

問題はありません。このオリジナルの名前と一致するデータがない場合は名前を確認でき、データがない場合はdbに追加します。別の方法は、重複するファイル名を避けるためにfilenameをrandomに設定することです。 –

+0

大丈夫です:同時に2つのフィールドを照会する方法はありますか? Item.findOne({'2つのフィールド'})のように。 TRUまたはFALSEのいずれかでなければなりません。ちょうどPHPのANDのように。 –