2017-08-27 9 views
0

私はMongoDB、Express、NodeJSを使用して少しソーシャルネットワークを作っています。 パスワードを暗号化するためのミドルウェアを持つこのスキーマを持っています。ミドルウェアの誤解Mongoose

const passwordValidators = [ 
    { 
     validator: passwordLengthChecker, 
     message: 'Password must be at least 5 characters but no more than 40' 
    }, 
    { 
     validator:validPassword, 
     message: 'Must have at least one uppercase, lowercase, special character, and number' 
    } 
]; 


/* ======== 
Schema for user 
========= */ 
const userSchema=new Schema({ 
    email: { type: String, required: true, unique: true, lowercase: true, validate: emailValidators}, 
    username: { type: String, required: true, unique: true, lowercase: true, validate: usernameValidators}, 
    password: { type: String, required: true,validate: passwordValidators}, 
    bio: { type:String,default:null}, 
    location: {type:String, default:null}, 
    gender: {type:String,default:null}, 
    birthday: { type:Date,default:null}, 
    img: { type:String, default:null} 
}); 


// Middleware that encrypt password 
userSchema.pre('save',function(next){ 
    if(!this.isModified('password')) 
    return next(); 

    bcrypt.hash(this.password, null, null, (err,hash)=>{ 
     if(err) return next(err); 
     this.password=hash; 
     next(); 
    }); 
}); 

、それが関連しています場合、私は知らないが、毎回私は(SAVE使用)私のルートでは、これはpasswordValidatorsを実行します。 私はmongooseの文書を読んだが、私はこれについて何も理解していないように感じる。私が推測した解決策は、登録していないときにこのミドルウェアをスキップすることでしたが、実際にはどのように行うのかわかりません。ここで

事がマングースは、あなたが保存する前に行うすべてのバリデータを実行していることであるルート

router.post('/edit-photo', upload,function (req,res){ 
     if (!req.file) { 
     res.json({success:false,message:"raté"}); 
     } 
     else{ 
     User.findOne({_id:req.decoded.userId},(err,user)=>{ 
      if(err){ 
       res.json({success:false,message:'Something went wrong: '+err}); 
      } 
      else{ 
       if (!user) { 
        res.json({success:false,message:'User not found'}); 
       } 
       else{ 
        user.img="Bloggy/uploads/profile/profile-pic-"+user.username; 
        user.save((err)=>{ // i get this err 
         if(err){ 
          res.json({success:false,message:'Something went wrong: '+err}); 
         } 
        }); 
        console.log('réussi'); 
       } 
      } 
     }); 
     } 
    }); 

答えて

0

です。

検証はミドルウェアです。 Mongooseはデフォルトですべてのスキーマにpre( 'save')フックとしてバリデーションを登録します。私の場合は

私がしなければならなかったすべては、このルート

の検証をスキップする

user.save({ validateBeforeSave: false },(err)=>{ 
         if(err){ 
          res.json({success:false,message:'Something went wrong: '+err}); 
         } 
         else{ 
          res.json({success:true,message:"Update to databse"}); 
         } 
        });