21

I'm trying to use redis for sessions in my express app.

I do the following:

var express = require('express');
var RedisStore = require('connect-redis')(express);

app.configure('development', function(){     
    app.use(express.session({ secret: "password", 
                            store: new RedisStore({
                                          host: "127.0.0.1",
                                          port: "6379",
                                          db: "mydb"
                                        })  
          }));

Later on, in my app, if i do something like:

var whatever = req.session.someProperty;

I get:

Cannot read property 'someProperty' of undefined

This indicates that req.session is undefined (I can see this from a console.log entry in my config section)

I've definitely got redis running, and can see my app connects to it initially (using redis-cli monitor)

Alex
  • 37,502
  • 51
  • 204
  • 332

5 Answers5

53

Sessions won't work unless you have these 3 in this order:

app.use(express.cookieParser());
app.use(express.session());
app.use(app.router);

I'm not sure if router is mandatory to use sessions, but it breaks them if it's placed before them.

Yxven
  • 641
  • 5
  • 3
10

Looks like you're missing:

app.use(express.cookieParser());

before your app.use(express.session(...)); call.

See here.

JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
4

Had the same problem, however it was caused by changes in the latest version of express.

You now need to pass express-session to the function connect-redis exports to extend session.Store:

var express = require('express');
var session = require('express-session')
var RedisStore = require('connect-redis')(session);
smilly92
  • 2,383
  • 1
  • 23
  • 43
4

Things have changed recently with Express 3 / Express 4. Please confirm you are using version 4.

The complete middleware concept changed. You need to install these middlewares manually. "express-session" is one of the 4.0 middlewares.

I recommend to read

http://scotch.io/bar-talk/expressjs-4-0-new-features-and-upgrading-from-3-0 and https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x

Additionally some users were confused that the github repo itself is named just "session" but

npm install express-session

is correct.

sebilasse
  • 4,278
  • 2
  • 37
  • 36
  • 1
    This question was asked Apr 17 2012, therefore NOT related to version 4 – Alex Apr 11 '14 at 09:56
  • For version 4: https://stackoverflow.com/questions/31611920/session-using-nodejs-and-express-4-x-req-session-undefined – NBTX Jun 17 '17 at 09:35
2

I had the same problem. It turned out that redis was simply configured to a different port.

kaore
  • 1,288
  • 9
  • 14
  • Thanks for putting me on the right track. I tripped over the fact that Heroku changed the REDIS_URL that I was using on my localhost. I could have known this as they mention this themselves: > "the REDIS config vars may change at any time. Relying on the config var outside of your Heroku app may result in you having to re-copy the value if it changes" https://devcenter.heroku.com/articles/heroku-redis#create-a-new-instance – Christiaan Westerbeek Jun 05 '19 at 09:24