2016-05-30 7 views
0

文書の保存が呼び出される直前にパスワードをハッシュしようとしています。私はハッシュを生成しようとしています(うまく動作します)し、新しいハッシュされたパスワードでドキュメント(文字列型)のパスワードフィールドを更新します。私のmongoose文書がbcrypt関数の中で正しく更新されないのはなぜですか?

ただし、user.password = hash行は何も変更されません。

私のデータベースをチェックしても何も変わりません!私の文書のデータをのhash/bcryptの外に変更しようとするとうまくいきます。私はパスワード「fake1」と私の文書を初期化してから、私のハッシュ関数のuser.password = "fakepassword"外に置く場合例えば

は、それは罰金、それを更新....

それはなぜですか?ハッシュ関数を入力したら参照番号thisが変更されますか?私が見たすべての例(私は何時間も何時間も探しました)は私のものとまったく同じです...なぜ私の仕事はうまくいかないのですか?

userSchema.pre('save', function(next) { 
    var user = this; // i reference the doc by "this" 
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err,salt){  
     if(err){ 
      console.log("error with salt \n"); 
     } 
      bcrypt.hash(user.password,salt,function(error,hash){ 
       if (error){ 
        console.log("error with hash \n"); 
       } 
       user.password = hash; // this line doesn't do anything! 

      }); 
    });   
    return next(user);                                      
}); 

答えて

1

非同期bcryptのコードが実行されるときは、next()を呼び出す必要があります。今、あなたはbcrypt.genSalt/bcrypt.hashの結果を待つことなくそれを呼び出しています。

また、nextに渡された引数は、エラーのために予約されています。すべてが正常になったら、引数なしでnextに電話する必要があります。

ここにあなたのミドルウェアのクリーンアップバージョンです:

userSchema.pre('save', function(next) { 
    var user = this; 
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { 
    if (err) { 
     console.log("error with salt \n"); 
     // Pass error back to Mongoose. 
     return next(err); 
    } 
    bcrypt.hash(user.password, salt, function(error, hash) { 
     if (error) { 
     console.log("error with hash \n"); 
     return next(error); 
     } 
     user.password = hash; 
     // Here are we done with the bcrypt stuff, so it's time to call `next` 
     next(); 
    }); 
    }); 
}); 
関連する問題