2016-06-16 21 views
1

編集:console.log(this)setPasswordメソッド内で実行されたことにより、ハッシュと塩だけが返されることがわかりました。なぜこれが起こっているのかわかりませんが、それはthisがモデルを参照していないことを示しています。Mongooseインスタンスメソッド `this`はモデルを参照していません


私は、次のインスタンスメソッドでは、次のスキーマを持っている:

let userSchema = new mongoose.Schema({ 
    username: {type: String, required: true}, 
    email: {type: String, required: true, index: {unique: true}}, 
    joinDate: {type: Date, default: Date.now}, 
    clips: [clipSchema], 
    hash: {type: String}, 
    salt: {type: String} 
}) 

userSchema.methods.setPassword = (password) => { 
    this.salt = crypto.randomBytes(32).toString('hex') 
    this.hash = crypto.pbkdf2Sync(password, this.salt, 100000, 512, 'sha512').toString('hex') 
} 

インスタンスメソッドは、ユーザーが保存され、ここで呼び出されます。

let user = new User() 

user.username = req.body.username 
user.email = req.body.email 
user.setPassword(req.body.password) 

user.save((err) => { 
    if (err) { 
    sendJsonResponse(res, 404, err) 
    } else { 
    let token = user.generateJwt() 
    sendJsonResponse(res, 200, { 'token': token }) 
    } 
}) 

しかし、私が見たときにmongo CLIのusersコレクションには、hashまたはsaltの記載はありません。

{ 
"_id" : ObjectId("576338b363bb7df7024c044b"), 
"email" : "[email protected]", 
"username" : "Bob", 
"clips" : [ ], 
"joinDate" : ISODate("2016-06-16T23:39:31.825Z"), 
"__v" : 0 
} 
+1

userSchema.methods.setPassword =機能(パスワード) '使用してみてください{...}' – Kairat

答えて

5

私が矢印メソッドを使用していたため、それが機能しなかった理由がありました。矢印関数は通常の関数とは異なるthisを扱うため

userSchema.methods.setPassword = function (password) {

理由は次のとおりです。私はそれを正常な機能をしなければなりませんでした。詳細については、以下を参照してください。

http://exploringjs.com/es6/ch_arrow-functions.html