关于session的原理以前一篇文章提过,详情请参考:结合实践谈谈cookie和session——cookie跨域session共享。下面整理一下在nodejs express框架中session的应用,和如何保存到数据库mongodb中。实现非常简单,直接用现成的库就可以了。
session的应用
session的使用可以直接用express-session库,默认在下载express框架的时候,对应的express-session也下载好了,在程序中可以直接使用,通过req.session就可以获取和操作其中的对象。假如没有该库,也可以通过npm安装:
$ npm install express-session
session使用的示例代码:
'use strict'; module.exports = function (router) { // session功能测试 router.get('/views', function (req, res) { console.log("session:", req.session); console.log("session id:", req.session.id); console.log("session cookie:", req.session.cookie); var sess = req.session; if (!sess.views) { sess.views = 1; return res.end('welcome to the session demo. refresh!'); } sess.views++; res.setHeader('Content-Type', 'text/html'); res.write('<p>views: ' + sess.views + '</p>'); res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>'); return res.end(); }); };
代码很简单,就是检测session中是否有views变量,如果有就+1,否则就声明并赋值为1。
express-session参考地址:https://github.com/expressjs/session
保存到mongodb
上例session默认是保存到内存中,如果应用程序需要部署成多进程、多服务器模式,那么就需要将session保存在公用的服务器上,这里选用mongodb做测试。在express-session的github上这个Compatible Session Stores章节详细罗列了可以使用的存储媒介。
如果用mongodb存储可以使用connect-mongo这个库。
$ npm install connect-mongo
在index.js文件中增加相应的session转存到mongodb代码:
'use strict'; var express = require('express'); var kraken = require('kraken-js'); var options, app; /* * Create and configure application. Also exports application instance for use by tests. * See https://github.com/krakenjs/kraken-js#options for additional configuration options. */ options = { onconfig: function (config, next) { /* * Add any additional config setup or overrides here. `config` is an initialized * `confit` (https://github.com/krakenjs/confit/) configuration object. */ next(null, config); } }; app = module.exports = express(); app.use(kraken(options)); // session相关,将session存储到mongodb const session = require('express-session'); const MongoStore = require('connect-mongo')(session); app.use(session({ secret: 'iqjmvh-178fd-fwh8f-cfenp', resave: true, saveUninitialized: true, store: new MongoStore({url: 'mongodb://192.168.1.119:27017/test'}) })); app.on('start', function () { console.log('Application ready to serve requests.'); console.log('Environment: %s', app.kraken.get('env:env')); });
其中secret,resave,saveUninitialized这个三个变量在初始化session的时候必须要设置,否则会弹出如下提示:
express-session deprecated undefined resave option; provide resave option index.js:29:9 express-session deprecated undefined saveUninitialized option; provide saveUninitialized option index.js:29:9 express-session deprecated req.secret; provide secret option index.js:29:9
这个三个变量涉及到安全方面的问题,所以官方特意取消了默认值设置,需要自行手动设置,详细含义可以在上面提到的github地址查看。
启动程序,访问下任意页面,看看mongodb是否就有记录了。

nodejs-express-session-store-in-mongodb
小结
总体来说还是蛮顺利的,另外如果用redis来存储,可以使用connect-redis,原理类似就不在累述。