-1

I'm trying to save a session when I log in but, when I try to sign in I get the error TypeError: Cannot read property 'save' of undefined. I am using express-session's req.session.save({}) method when I get the error. what is wrong with my code and how do I fix this error?

adminLoginRoutes.js

const router = require('express').Router()
const {check, validationResult} = require('express-validator')
const path = require('path')
const bodyparser = require('body-parser')
const urlencodedParses = bodyparser.urlencoded({ extended: false })
const { AdminAccount } = require('../models')
const sequelize = require('sequelize')

router.use(bodyparser.json())
router.use(bodyparser.urlencoded({ extended: false }))


router.post('/', [
    check('email')
    .isEmail(),
    
    check('password')
    .isLength({ min: 6 })
    
], (req, res) => {
    const errors = validationResult(req)
    
    if(!errors.isEmpty()) {
        // res.send(errors)
    }
 
    AdminAccount.findOne({
        where: 
        {
            email: req.body.email
        }
    }).then(dbAdminLoginData => {

        if(!dbAdminLoginData) {
                res.json({ message: 'No user with that email address'});
                return;
            }
            
                const validPassword = dbAdminLoginData.checkPassword(req.body.password) 
                
                
                if (!validPassword) {
                    res.json({ message: 'Incorrect password!'});
                    return; 
                }

            req.session.save(() => {
                req.session.user_id = dbAdminLoginData.id
                req.session.username = dbAdminLoginData.email
                req.session.loggedIn = true;
    
                res.json({user: dbAdminLoginData, message: 'you are now logged in'})
            })
    }).catch(err => console.log(err))
})

server.js

const express = require('express')
const sequelize = require('./config/connection')
const exphbs = require('express-handlebars')
const hbs = exphbs.create({})
const session = require('express-session')

const SequalizeStore = require('connect-session-sequelize')(session.Store)

const sess = {
    secret: "Hello123!",
    cookie: {},
    resave: false,
    saveUninitialized: true,
    store: new SequalizeStore({
        db: sequelize
    })
}

const routes = require('./controllers')
// const routes = require('./routes/apiRoutes')
const app = express()
const PORT = process.env.PORT || 3001;

app.use(express.static('public'));
app.use(express.json());
app.use(routes)
app.use(express.urlencoded({ extended: true }));
app.use(session(sess))

app.engine('handlebars', hbs.engine)
app.set('view engine', 'handlebars')

sequelize.sync({ force: false }).then(() => {
    app.listen(PORT, () => console.log('now listening'))
})
Ben
  • 1
  • 2

1 Answers1

1

The order of middlewares' usage defines the order they will be applied.

You have

app.use(express.json());
app.use(routes)
app.use(express.urlencoded({ extended: true }));
app.use(session(sess))

So you router will be applied before url encoded parser and session.

It has to be

app.use(express.static('public'));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(session(sess))

app.use(routes) // Here you will have request object augmented.
Yury Tarabanko
  • 44,270
  • 9
  • 84
  • 98