在Node.js中,我們通常使用express-session這個套件來使用和管理session,保存服務端和客戶端瀏覽器之間的會話狀態。那要如何才能實現當使用者刷新目前頁面或點擊頁面上的按鈕時重新刷新session的過期時間呢?類似ASP.NET中session會話狀態,只要在一定的時間內頁面一直保持活動狀態,session就不會過期。透過下面的程式碼可以實現這個功能,我們在Node.js的程式碼中加入下面的中間件:
// 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(); });
這樣,每次當有請求過來時,該中間件都會重新修改session的過期時間,從而達到預期的效果。
然後,在程式碼中加入session的使用:
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_' }) }));
上面的session使用了memcached作為session的儲存方式,有關如何使用memcached可以參考Github上的這個位址https://github.com/balor/connect-memcached
當然,你也可以使用其它的session儲存方式,例如memoryStore,redis,mongoDB等等,使用方法都大同小異。
下面要跟大家說說Node.js session 儲存的幾個方法
node.js session store 有可選的四種方法的效能測試如下:
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]
比較得出redis來儲存在並發性越多的情況下效能優越。
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'}));
使用mongodb儲存時別忘記在載入一個模組:connect-mongo