Идентификатор пользователя не сохраняется в сеансе после входа в систему

#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)

    }


  })
}  

Скриншот консоли — регистрация

Скриншот mongo — регистрация

Скриншот консоли — вход в систему

Скриншот монго — входа в систему

Я следил за полным стеком Java Script Брэда Шиффса с нуля, и, похоже, у него все работает нормально.

Ответ №1:

Ваша модель ничего не делает с найденным пользователем: попробуйте

 if(attemptedUser amp;amp; bcrypt.compareSync(this.data.password, attemptedUser.password)) {
    this.data.attemptedUser = attemptedUser
    this.getAvatar()
    resolve("Congrats !")