2016-04-20 1 views
0

私のスキーマでは、いくつかのキーの最小長要件を設定しました。いくつかの変更で検証が失敗した場合、Mongooseが保存を続行する方法はありますか?

mphone: {type: String, minlength: 1}, 
hphone: {type: String, minlength: 1}, 
wphone: {type: String, minlength: 1}, 

上記の情報は、ユーザーが送信するフォームを通じて入力されます。ユーザーがフォームを送信すると、次の処理が実行され、情報がDBに保存されます。ユーザーは専用フォーム内のフィールドのいずれかを記入し、それを提出した場合

var query = Sample.where({'sample.email' : username}); 
query.findOne(function(err, sample) { 
    if(err) { 
     console.error(err); 
    } 
    else { 
     sample.mphone = req.body.mphone; 
     sample.hphone = req.body.hphone; 
     sample.wphone = req.body.wphone; 

     sample.save(function(err) { 
      if(err) console.error(err); 
     }); 
    } 

しかし、スキーマの検証、(例えば、唯一mphone記入)、セーブ全体の動作は拒否されます。 Mongooseが無効なフィールドを単に拒否して、たとえばmphoneだけを保存できるようにする設定はありますか?私は個々にテストしてそれぞれを保存することができると思いますが、もっと効率的な方法があるかどうかを知りたいと思います。

+1

さて、あなたは実際には 'minlength'または' required'制約を持たせたくありません。フィールドの「どちらか」に何かが存在する必要がある「カスタム検証」を実際に求めている場合は、定義済みのデフォルトのバリデータではなく「前」のミドルウェアフックが必要です。 –

答えて

0

操作(例:create())によっては、ドキュメントに従って検証が完全にスキップされます。

つまり、少なくとも1つのフィールドに記入するルールがある場合は、検証ミドルウェアを使用する必要があります。このような(テストされていない)何か:

SampleSchema.pre('validate', function(next){ 
    if(!this.mphone && !this.hphone && !this.wphone) return next(new ValidationError('At least one type of phone is needed!')); 
    next(); 
});