2016-10-06 7 views
0

私は、Mongo、Express、Angular、Nodeという意味でGetting MEANというスタックを使ってMEANスタックを学習しています。は、この割り当てでMongoDBにデータを保存できません。

私はコードに従ってすべてをテストしますが、エラーなしでバグを取得します。ブックページ364で、MongoDBにsaltとhashを保存できません。

私はdb.users.find()コマンドでMongoDBをチェックしたときに、MongoDB上で_id、名前、電子メール、__vを得ることができるだけで、本と同じコードをテストするためにpostmanを使用しています。

次のリストのような結果:

"_id" : ObjectId("57f5f1a91093e2650f427081"), 
"email" : "[email protected]", 
"name" : "bb7", 
"__v" : 0 

私はアーチLinuxやMongoDBのバージョンが3.2.9

であると私はするsetPasswordメソッドが問題を起こすと思いますが、エラーなし、奇妙な使用。

のsetPasswordメソッドが

userSchema.methods.setPassword = (password) => { 
    this.salt = crypto.randomBytes(16).toString('hex'); 
    this.hash = crypto.pbkdf2Sync(password, this.salt, 1000,64, 'sha512').toString('hex'); 
}; 

で、レジスタについての私の全体のコードは

users.js

var mongoose = require('mongoose'); 
var crypto = require('crypto'); 
var jwt = require('jsonwebtoken'); 

var userSchema = new mongoose.Schema({ 
    email: { 
    type: String, 
    unique: true, 
    required: true 
}, 
    name: { 
    type: String, 
    required: true 
    }, 
hash: String, 
    salt: String 
}); 

userSchema.methods.setPassword = (password) => { 
    this.salt = crypto.randomBytes(16).toString('hex'); 
this.hash = crypto.pbkdf2Sync(password, this.salt, 1000,64, 'sha512').toString('hex'); 
}; 

userSchema.methods.validPassword = (password) => { 
    console.log('this salt '+this.salt); 
// pbkdf2 params is password, salt, iterations, hashBytes, digest 
var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha512').toString('hex'); 
    console.log('this hash '+this.hash); 
return this.hash === hash; 
    }; 

userSchema.methods.generateJwt =() => { 
    var expiry = new Date(); 
    expiry.setDate(expiry.getDate() + 7); 

return jwt.sign({ 
_id: this._id, 
email: this.email, 
name: this.name, 
exp: parseInt(expiry.getTime()/1000) // Unix time in seconds 
}, process.env.JWT_SECRET); 
}; 

mongoose.model('User', userSchema); 

authentication.js上

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

var sendJSONresponse = (res, status, content) => { 
    res.status(status); 
res.json(content); 
}; 

module.exports.register = (req, res) => { 

    if(!req.body.name || !req.body.email || !req.body.password) { 
    sendJSONresponse(res, 400, { 
     'message': "All fields required" 
    }); 
    return; 
    } 

    var user = new User(); 

    user.name = req.body.name; 
    user.email = req.body.email; 

    user.setPassword(req.body.password); 

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

/** login */ 
module.exports.login = (req, res) => { 
    if(!req.body.email || !req.body.password) { 
    sendJSONresponse(res, 400, { 
    'message':'All fields required' 
    }); 
    return; 
} 

    passport.authenticate('local', (err, user, info) => { 
    var token; 

    if(err) { 
     sendJSONresponse(res, 404, err); 
     return; 
    } 

    if(user) { 
     token = user.generateJwt(); 
    sendJSONresponse(res, 200, { 
     'token': token 
     }); 
    } else { 
     sendJSONresponse(res, 401, info); // info msg about why authentication failed 
    } 
})(req, res); 
    }; 

、全体のコードですギthubアドレスはhttps://github.com/simonholmes/getting-MEAN/tree/chapter-11ここ

答えて

0

は私がやっていることである:

  • クローンレポ:git clone [email protected]:simonholmes/getting-MEAN.git
  • チェックアウトブランチ:cd getting-MEAN; git checkout chapter-11
  • 設定JWT秘密:export JWT_SECRET=secret
  • スタートアプリ:npm start

リクエスト:受信した応答で

curl -v -X POST http://localhost:3000/api/register -d "[email protected]&password=pass&name=user" 

{"token":"some token"} 

その後はモンゴDBを確認:残りの属性を持つ

mongo 
> use Loc8r 
> db.users.find() 

ハッシュ&塩が一緒に保存されています。あなたはここにどのような問題があるのか​​分かりません。あなたが応答したより多くの属性は、単にauthenticationコントローラにregister方法で返されるものを延ばす取得したい場合:

user.save(function(err, user) { 
    var token; 
    if (err) { 
    sendJSONresponse(res, 404, err); 
    } else { 
    token = user.generateJwt(); 
    sendJSONresponse(res, 200, { 
     "token" : token, 
     "email": user.email, 
     "id": user._id 
    }); 
    } 
}); 
+0

いいえ、私はMongoDBの中の塩やハッシュを保存したいので、あなたは私にあなたのシステムとのMongoDBのバージョンを言うことができるし、 nodeJs?私は非常にmongoDBにデータを保存することはできません混乱し、私はそれを半日固定、私はsetPassword関数が問題を抱えていると感じるが、わからない。あなたは@ mkorszun – Roy

+0

していただきありがとうございます、私はあなたがデバッグを開始することをお勧めします。生成されたハッシュと塩を含むコンソールログをいくつか追加し、それらの値をチェックしてください。また、保存する直前にユーザーオブジェクトもチェックしてください。ソルト&ハッシュが設定されている場合は答えが必要です。 – mkorszun

+0

私はそれを得ました。問題はES6の矢印機能です。nodeJsではOKだと思っていました。ありがとうございました。 – Roy

関連する問題