In Node.js, we usually use the express-session package to use and manage sessions and save the session state between the server and the client browser. So how can we achieve the expiration time of the session when the user refreshes the current page or clicks a button on the page? Similar to the session state in ASP.NET, as long as the page remains active for a certain period of time, the session will not expire. This function can be achieved through the following code. We add the following middleware to the Node.js code:
// use this middleware to reset cookie expiration time // when user hit page every time app.use(function(req, res, next){ req.session._garbage = Date(); req.session.touch(); next(); });
In this way, every time a request comes in, the middleware will re-modify the session expiration time to achieve the desired effect.
Then, add the use of session to the code:
app.use(session({ secret: 'test', resave: false, saveUninitialized: true, cookie:{ maxAge: 1000*60*60 // default session expiration is set to 1 hour }, store: new MemcachedStore({ hosts: ['127.0.0.1:9000'], prefix: 'test_' }) }));
The above session uses memcached as the session storage method. For how to use memcached, you can refer to this address on Github https://github.com/balor/connect-memcached
Of course, you can also use other session storage methods, such as memoryStore, redis, mongoDB, etc., and the usage methods are similar.
Let me talk about several methods of Node.js session storage
Node.js session store has four optional methods for performance testing as follows:
Concurrency: 1 none 4484.86 [#/sec] memory 2144.15 [#/sec] redis 1891.96 [#/sec] mongo 710.85 [#/sec] Concurrency: 10 none 5737.21 [#/sec] memory 3336.45 [#/sec] redis 3164.84 [#/sec] mongo 1783.65 [#/sec] Concurrency: 100 none 5500.41 [#/sec] memory 3274.33 [#/sec] redis 3269.49 [#/sec] mongo 2416.72 [#/sec] Concurrency: 500 none 5008.14 [#/sec] memory 3137.93 [#/sec] redis 3122.37 [#/sec] mongo 2258.21 [#/sec]
Comparison shows that redis storage has superior performance when there is more concurrency.
The session used pages are very simple pages;
app.get("/", function(req,res){ if ( req.session && req.session.user_id){ req.session.no = req.session.user_id; } else { throw Error('error'); } res.send("No: " + req.session.no);});
Redis store config:
app.use(express.session({ store: new RedisStore({ host: 'localhost', port: 6379, db: 2, }), secret: 'hello'}));
Mongo store config:
app.use(express.cookieParser());app.use(express.session({ store: new MongoStore({ url: 'mongodb://localhost/test-session' }), secret: 'hello'}));
Don’t forget to load a module when using mongodb storage: connect-mongo