最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

nodejs express session的应用和存储到mongodb

编程开发 655浏览 0评论

关于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

nodejs-express-session-store-in-mongodb

小结

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

转载请注明:快乐编程 » nodejs express session的应用和存储到mongodb

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址