私は、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ここ
いいえ、私はMongoDBの中の塩やハッシュを保存したいので、あなたは私にあなたのシステムとのMongoDBのバージョンを言うことができるし、 nodeJs?私は非常にmongoDBにデータを保存することはできません混乱し、私はそれを半日固定、私はsetPassword関数が問題を抱えていると感じるが、わからない。あなたは@ mkorszun – Roy
していただきありがとうございます、私はあなたがデバッグを開始することをお勧めします。生成されたハッシュと塩を含むコンソールログをいくつか追加し、それらの値をチェックしてください。また、保存する直前にユーザーオブジェクトもチェックしてください。ソルト&ハッシュが設定されている場合は答えが必要です。 – mkorszun
私はそれを得ました。問題はES6の矢印機能です。nodeJsではOKだと思っていました。ありがとうございました。 – Roy