I'm new to coding and I'm trying to write one of my first apps. I encountered a problem with my log in function. The user id saves into my session object after user registration but it won't save into it after a log in. I'm using MongoDB. Here is the code:
Controller
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)
})
})
}
Model
User.prototype.login = function() {
return new Promise((resolve, reject) => {
this.cleanUp()
usersCollection.findOne({
username: this.data.username
}).then((attemptedUser) => {
if (attemptedUser && 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)
}
})
}
Screenshot of the console - registration
Screenshot of mongo - registration
Screenshot of the console - log in
I've been following Brad Schiffs Java Script Full Stack from Scratch course and everything seems to be working fine for him.
Your model does nothing with found user: try
if(attemptedUser && bcrypt.compareSync(this.data.password, attemptedUser.password)) {
this.data.attemptedUser = attemptedUser
this.getAvatar()
resolve("Congrats !")