Skip to content

Commit fcbcb8d

Browse files
authored
Merge pull request #497 from timeoff-management/tom-xxx-redis-as-session-store
Introduce Redis as alternative session storage.
2 parents df738ee + cf37823 commit fcbcb8d

File tree

7 files changed

+130
-19
lines changed

7 files changed

+130
-19
lines changed

app.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var logger = require('morgan');
66
var cookieParser = require('cookie-parser');
77
var bodyParser = require('body-parser');
88
var moment = require('moment');
9+
const createSessionMiddleware = require('./lib/middleware/withSession');
910

1011
var app = express();
1112

@@ -37,16 +38,8 @@ app.use(express.static(path.join(__dirname, 'public')));
3738
// Setup authentication mechanism
3839
const passport = require('./lib/passport')();
3940

40-
var session = require('express-session');
41-
// Initialize sequelize with session store
42-
var SequelizeStore = require('connect-session-sequelize')(session.Store);
43-
app.use(session({
44-
secret : 'my dirty secret ;khjsdkjahsdajhasdam,nnsnad,',
45-
resave : false,
46-
saveUninitialized : false,
47-
store: new SequelizeStore({
48-
db: app.get('db_model').sequelize
49-
}),
41+
app.use(createSessionMiddleware({
42+
sequelizeDb: app.get('db_model').sequelize,
5043
}))
5144
app.use(passport.initialize());
5245
app.use(passport.session());

config/app.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
"pass" : "pass"
1111
}
1212
},
13+
"sessionStore": {
14+
"useRedis": false,
15+
"redisConnectionConfiguration": {
16+
"host": "localhost",
17+
"port": 6379
18+
}
19+
},
1320
"ga_analytics_on" : false,
1421
"crypto_secret" : "!2~`HswpPPLa22+=±§sdq qwe,appp qwwokDF_",
1522
"application_domain" : "http://app.timeoff.management",

config/db.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"development": {
33
"dialect": "sqlite",
44
"storage": "./db.development.sqlite",
5-
"logging": false
5+
"logging": false
66
},
77
"test": {
88
"username": "root",

docs/SessionStoreInRedis.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# How to use Redis as storage for Sessions
2+
3+
By default application uses its database as a storage for session data (`Sessions` table).
4+
5+
It is possible to use different storage mechanism for Sessions data: [Redis](https://redis.io/).
6+
7+
## Steps
8+
9+
* Ensure the application's source is at least `1.4.0`
10+
* Stop the application
11+
* Open `config/app.json` for editing
12+
* Update `sessionStore.useRedis` section to be `true`
13+
* Update `sessionStore.redisConnectionConfiguration`'s `host` and `port` pointing to corresponding instance of Redis
14+
* Save the configuration file
15+
* Restart the application

lib/middleware/withSession.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
const session = require('express-session');
3+
const SequelizeStore = require('connect-session-sequelize')(session.Store);
4+
5+
const redis = require('redis');
6+
const connectRedis = require('connect-redis');
7+
8+
const {sessionStore: sessionStoreConfig} = require(__dirname + '/../../config/app.json') || {};
9+
10+
const createSessionMiddleware = ({
11+
sequelizeDb,
12+
}) => {
13+
let store;
14+
15+
if (sessionStoreConfig && sessionStoreConfig.useRedis) {
16+
const RedisStore = connectRedis(session);
17+
const {redisConnectionConfiguration = {}} = sessionStoreConfig;
18+
const {host, port} = redisConnectionConfiguration;
19+
if (!(host && port)) {
20+
throw new Error('Missing configuration for Redis to use with Sessions');
21+
}
22+
const redisClient = redis.createClient({ host, port });
23+
24+
redisClient.on('error', function (err) {
25+
throw new Error(`Failed to connect to Redis: ${err}`);
26+
});
27+
redisClient.on('connect', function (err) {
28+
console.log('Connected to redis successfully');
29+
});
30+
31+
store = new RedisStore({ client: redisClient });
32+
} else {
33+
if (!sequelizeDb) {
34+
throw new Error('Database connection was not provided into Session store manager!');
35+
}
36+
store = new SequelizeStore({ db: sequelizeDb });
37+
}
38+
39+
return session({
40+
store,
41+
secret: 'my dirty secret ;khjsdkjahsdajhasdam,nnsnad,',
42+
resave: false,
43+
saveUninitialized: false,
44+
});
45+
};
46+
47+
module.exports = createSessionMiddleware;

package-lock.json

Lines changed: 55 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"dependencies": {
1010
"bluebird": "^2.10.2",
1111
"body-parser": "^1.8.4",
12+
"connect-redis": "^6.0.0",
1213
"connect-session-sequelize": "3.0.0",
1314
"cookie-parser": "^1.3.5",
1415
"csv": "~0.4.6",
@@ -33,6 +34,7 @@
3334
"passport": "^0.3.2",
3435
"passport-http-bearer": "^1.0.1",
3536
"passport-local": "^1.0.0",
37+
"redis": "^3.1.2",
3638
"sequelize": "^3.19.2",
3739
"sequelize-cli": "2.5.1",
3840
"serve-favicon": "^2.1.7",

0 commit comments

Comments
 (0)