#mongodb #mongoose
#mongodb #мангуст
Вопрос:
Я изучаю MEAN stack с книгой Getting MEAN с помощью Mongo, Express, Angular и Node.
Я следую коду и все тестирую, но получаю ошибку без ошибок, на странице книги 364, я не могу сохранить соль и хэш в MongoDB.
Я использую postman для тестирования своего кода так же, как и в книге, и я могу получить JWT в postman, но могу получить _id, name, email и __v только в MongoDB, когда я проверил MongoDB с db.users.find()
помощью command.
результат, подобный следующему списку:
"_id" : ObjectId("57f5f1a91093e2650f427081"),
"email" : "bb7@q.com",
"name" : "bb7",
"__v" : 0
Я использую arch 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);
};
и весь код на адресе github https://github.com/simonholmes/getting-MEAN/tree/chapter-11
Ответ №1:
Вот что я сделал:
- клонирование репозитория:
git clone git@github.com:simonholmes/getting-MEAN.git
- ветка оформления заказа:
cd getting-MEAN; git checkout chapter-11
- Установите JWT secret:
export JWT_SECRET=secret
- запустить приложение:
npm start
И отправить запрос на регистрацию:
curl -v -X POST http://localhost:3000/api/register -d "email=user@gmail.comamp;password=passamp;name=user"
В ответ получено:
{"token":"some token"}
Затем проверил mongo db:
mongo
> use Loc8r
> db.users.find()
Хэш и соль хранятся вместе с атрибутами rest. Итак, не уверен, какая у вас проблема? Если вы хотите получить больше атрибутов в ответ, просто расширьте то, что возвращается в register
методе в authentication
контроллере:
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
});
}
});
Комментарии:
1. нет, я хочу сохранить соль и хэш в MongoDB, поэтому не могли бы вы рассказать мне о своей системе и версиях MongoDB и NodeJS? Я очень смущен, почему не удается сохранить данные в MongoDB, и я исправил это на полдня, я чувствую, что у функции SetPassword есть проблемы, но не уверен. и спасибо @mkorszun
2. затем я рекомендую вам начать отладку; просто добавьте несколько консольных журналов с сгенерированными хэшем и солью и проверьте их значения. Также проверьте объект user непосредственно перед его сохранением — у вас должен быть ответ, если заданы salt amp; hash.
3. Я понял, проблема в функции стрелки в ES6, я подумал, что в NodeJS все в порядке, поэтому я изменил ее. еще раз спасибо.