2017-08-22 5 views
1

私は経路をテストするためにPostmanを使用していますが、パスワードが長すぎると言うuser.save((err)=>{})の後にエラーメッセージが返されます。私が作成したpasswordValidatorを使用していますが、私は明らかにSchemaではなくこのルートのために呼び出さなかったのです。Mongooseで間違ったバリデータを使用して経路を設定します

私は間違っていますか?

マングースにおけるユーザー・スキーマ:

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}, 
    bio: { type:String,default:null,validate:bioValidators}, 
    location: {type:String, default:null}, 
    gender: {type:String,default:null,validate:genderValidators}, 
    birthday: { type:String,default:null}, 
    password: { type: String, required: true,validate: passwordValidators} 
}); 

ルート:

EDIT

ここでパスワードのバリデータの配列が

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' 
    } 
]; 
です

とチェッカー

let passwordLengthChecker = (password)=>{ 
    if (!password) { 
     return false; 
    } 
    else{ 
     if(password.length<5 || password.length>40){ 
      return false; 
     } 
     else{ 
      return true; 
     } 
    } 
}; 

let validPassword = (password)=>{ 
    if (!password) { 
     return false; 
    } 
    else{ 
     const regExp = new RegExp(/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[\d])(?=.*?[\W]).{8,35}$/); 
     return regExp.test(password); 
    } 
}; 

あなたはそれがない

EDITのN°2

私はちょうど私がちょうどスキーマ

の下に、このミドルウェアを持って実現しなければならないのに、それがpasswordLengthCheckerを使用しています見ることができるように
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()を使用するたびにこの関数が実行されるのでしょうか?

+0

'検証:passwordValidators'これは問題ではありませんか?あなたはpasswordValidatorsに何を使用していますか?私たちを見せてもらえますか? –

+0

ここにバリデーター –

+0

の回答を確認してください。あなたはユーザーのパスワードを提供することを忘れている@Azoulayジェイソン –

答えて

1

あなたはbiolocationgenderbirthdayではなく、パスワードを提供し、問題となっています。パスワードを宣言しないと、length0に等しくなります。だからこそエラーを取り戻すのです。長さは、5から40までです。

else{ 
            user.password=req.body.password; 
            //I added user.password here, this is what you should do 
            user.bio=req.body.bio; 
            user.location=req.body.location; 
            user.gender=req.body.gender; 
            user.birthday=req.body.birthday; 
            user.save((err)=>{ 
             if(err){ 
              res.json({success:false,message:'Something went wrong: '+ err}); //returns this 
             } 
             else{ 
              res.json({success:true,message:"Account updated !"}); 
             } 
            }); 
           } 

HERE UPDATE

あなただけbiolocationgenderbirthdayを更新しようとしている場合は、save()機能を使用することは間違っています。 findOneAndUpdate()機能を使用する必要があります。

User.findOneAndUpdate({_id:req.decoded.userId}, { $rename : {gender: 'male' , bio : 'somethingElse'}}, {new: true}, function(err, user){ 
if(err) throw err; 
else{ 
console.log("done : " + user.gender); 
} 
}); 

また findOneAndUpdate参照してくださいと its operators to be used

+0

あなたの答えをありがとう、それは私が最初にthougtだので、私はこの解決策を試みたが、パスワードは暗号化されているため、passwordValidatorsに収まりません。 ここで本当の問題は、すべてのバリデータが実行され、この問題を回避するための解決策が見つからないということです。 –

+0

@AzoulayJason次に設定を変更する必要があります。暗号化される前に長さを確認する必要があります。 'post'リクエストの直後にバックエンドサーバの –

+0

を追加し、**ユーザ入力**の長さを確認してから' req.body.password'を先に進めてください。あなたの設定は間違っています@AzoulayJason –

0

だから、私はbcrypt関数がMongooseのsave()関数を危険にさらしたと思います。 私は現在Mongooseのドキュメントで他の解決策を見つけました。ダウンここ

User.findByIdAndUpdate(req.decoded.userId,{$set:{bio:req.body.bio, location:req.body.location, gender:req.body.gender, birthday:req.body.birthday}},{new:true},function(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{ 
            res.json({success:true,user:user}); 
           } 
          } 
         }); 
関連する問題