代码改变世界

Express session 模块的扩展

2013-05-25 20:18  straybird  阅读(440)  评论(0编辑  收藏  举报

session 数据的处理是很敏感的,在每个请求的处理逻辑块中直接调用 req.session 显得很不规范,所以需要一个模块来单独管理session的读写。

再考虑不能为每个用户的session添加读写function,因为这样会导致性能损耗,所以必须对session对象做一个基类扩展。

在无法显式知道session 构造函数的情况下只能使用 constructor 关键字,进而获取其 prototype 属性,实现原型继承。

session.js

var sessionConstructed = false;

exports.get = function (req) {
    var session = req.session;

    if (!sessionConstructed) {
        var cst = session.constructor;

        cst.prototype.userInfo = function () {
            return this.user;
        };
        cst.prototype.initUser = function (username, source) {
            this.user = {
                username: username,
                source: source
            };
        };
        cst.prototype.clearUser = function () {
            this.user = null;
        };

        cst.prototype.checkVerifyCode = function (code) {
            if (!this._verifyCode || this._verifyCode != code.toLowerCase()) {
                this._verifyCode = null;
                return false
            } else {
                return true;
            }
        }
        cst.prototype.setVerifyCode = function (code) {
            this._verifyCode = code.toLowerCase();
        }
        sessionConstructed = true;
    }

    return session;
}

howToUse.js

var session = require('./session.js')

function onSomeRequst(req, res){

    var ses = session.get(req);

    var userInfo = session.get(req).userInfo();

    var verifyCode = '1234';

    var isVerifyCodeRight = session.checkVerifyCode(verifyCode);
}