#javascript #node.js #mongodb #express #express-session
#javascript #node.js #mongodb #экспресс #экспресс-сессия
Вопрос:
Я новичок в программировании и пытаюсь написать одно из своих первых приложений. Я столкнулся с проблемой с моей функцией входа в систему. Идентификатор пользователя сохраняется в моем объекте сеанса после регистрации пользователя, но он не сохраняется в нем после входа в систему. Я использую MongoDB. Вот код:
Контроллер
exports.register = function(req, res){
let user = new User(req.body)
user.register().then(()=>{
// what do we do if the registration is succesfull - redirecting to the homepage with updated session data
req.session.user = {username: user.data.username, avatar: user.avatar, _id: user.data._id}
req.session.save(function(){
res.redirect('/')})
console.log(' After the registration usercontroller line nr 14 ', user.data._id)
}).catch((regErrors)=>{
regErrors.forEach(function(error){
req.flash('regErrors', error)
})
req.session.save(function(){
res.redirect('/')
})
})
}
exports.login = function(req, res){
let user = new User(req.body)
user.login().then(function(result){
//saving data into a cookie
req.session.user = {avatar: user.avatar, username: user.data.username, _id: user.data._id}
req.session.save(function(){
res.redirect('/')
console.log('After the log in line 51 userController', req.session)
})
}).catch(function(e){
req.flash('errors', e)
req.session.save(function(){
res.redirect('/')
// After the failed log in
console.log('After the failed log in line 61', req.session)
})
})
}
Модель
User.prototype.login = function() {
return new Promise((resolve, reject) => {
this.cleanUp()
usersCollection.findOne({
username: this.data.username
}).then((attemptedUser) => {
if (attemptedUser amp;amp; bcrypt.compareSync(this.data.password, attemptedUser.password)) {
this.data.attemptedUser
this.getAvatar()
resolve("Congrats !")
} else {
reject("Invalid username/password")
}
}).catch(function() {
reject("Please try again later.")
})
})
}
User.prototype.register = function() {
return new Promise(async(resolve, reject) => {
//Step #1: Validate user data
await this.validate()
this.cleanUp()
//Step #2: Only if there are no validation errors save the user data into a database
if (!this.errors.length) {
// Hash user password
let salt = bcrypt.genSaltSync(10)
this.data.password = bcrypt.hashSync(this.data.password, salt)
await usersCollection.insertOne(this.data)
this.getAvatar()
resolve()
} else {
reject(this.errors)
}
})
}
Скриншот консоли — регистрация
Скриншот консоли — вход в систему
Скриншот монго — входа в систему
Я следил за полным стеком Java Script Брэда Шиффса с нуля, и, похоже, у него все работает нормально.
Ответ №1:
Ваша модель ничего не делает с найденным пользователем: попробуйте
if(attemptedUser amp;amp; bcrypt.compareSync(this.data.password, attemptedUser.password)) {
this.data.attemptedUser = attemptedUser
this.getAvatar()
resolve("Congrats !")