2017-09-10 11 views
0

mongooseを使用してJSONのbcryptハッシュパスワードをmongodbに保存できません。私はsetPasswordスキーマメソッドの実装に間違いがあると思います。私は 'bcrypt'を 'crypto'の実装に置き換え、うまくいきました。ハッシュされた文字列はデータベースに格納されました。しかし、できないは 'bcryptの'mongooseを使用してJSONのbcryptハッシュされたパスワードをmongodbに保存できません。

マイmodel.js実装

const mongoose = require('mongoose'); 
const bcrypt = require('bcrypt'); 

const Schema = mongoose.Schema; 

// User Schema 
const userSchema = new Schema({ 
    username: { 
    type: String, 
    index: true 
    }, 
    password: { 
    type: String 
    }, 
    email: { 
    type: String 
    }, 
    name: { 
    type: String 
    } 
}); 

userSchema.methods.setPassword = function(password) { 
    const saltRounds = 10; 
    bcrypt.hash(password, saltRounds, function(err, hash) { 
    this.password = hash; 
    }); 
}; 

mongoose.model('User', userSchema); 

マイルータコントローラの実装bcrypt.hashないuserSchemaオブジェクトへ

const passport = require('passport'); 
const mongoose = require('mongoose'); 
const User = mongoose.model('User'); 

const register = (req, res) => { 

    const newUser = new User(); 

    newUser.name = req.body.name; 
    newUser.email = req.body.email; 
    newUser.username = req.body.username; 
    newUser.setPassword(req.body.password); 

    newUser.save((err) => { 
    // Validations error 
    if (err) { 
     res.status(400).json(err); 
     return; 
    } 

    res.status(200).json({ 
     success: true, 
     message: 'Registration Successful' 
    }); 

    }); 
}; 
+1

あなたが確認していない 'bcrypt.hash'によって生成されたエラーがあるかもしれません。 –

+0

@BrahmaDev if(err)throw err;行を追加しました。それでもエラーは発生しません。 –

+0

同期バージョンを試すことはできますか? 'this.password = bcrypt.hashSync(password、saltRounds);' –

答えて

0

thisポイントでそうします。

userSchema.methods.setPassword = function(password) { 
    const saltRounds = 10; 
    var that = this; 
    bcrypt.hash(password, saltRounds, function(err, hash) { 
    that.password = hash; 
    }); 
}; 

UPDATE:使用コールバックまたは約束

userSchema.methods.setPassword = function(password, cb) { 
    const saltRounds = 10; 
    var that = this; 
    bcrypt.hash(password, saltRounds, function(err, hash) { 
    that.password = hash; 
    cb(); 
    }); 
}; 

newUser.setPassword(req.body.password, function(){ 
    //Rest of code 
}); 
+0

これは機能しません。 bcryptの中で 'that.password'を印刷すると、bcryptの外側にはハッシュが印刷されていますが、定義されていません。 –

+0

@JajatiKeshariR 'that.password'が未定義のまま残っていると、' bcrypt.hash'は真に非同期でコールバックを待つ必要があります。 –

+0

ありがとうございます。コールバックを使用してバージョンを更新しました。 –

関連する問題