session插件开发

上一节的分析,我们了解了cookie和session的关系。接下来,将实际的开发session插件,以下是session插件源代码。

var sid = Date.now() , cache = {}

module.exports = function(req,res,next){

    Object.defineProperty(req,"session",{
        get: function(){
            return cache[this.sessionId];
        },
        set: function(value){
            cache[this.sessionId] = value;
        }
    })

    if(!(req.headers.cookie && (req.sessionId = parse(req.headers.cookie).sessionId))){

        req.sessionId = sid += 1;
        res.setHeader("Set-Cookie",["sessionId="+req.sessionId])
    }

    next();

}

// 把cookie字符串转换为json对象
function parse(str){
    var arr = str.split(";")
       ,obj = {}

    arr.forEach(function(field){
        var o = field.split("=");
        obj[o[0].trim()] = o[1];
    })

    return obj;
}

sid是一个生成ID的时间阀,每次需要生成性的sessionId时候会 +1 , cache是保存session id对应的数据,这个数据用户可通过req.session = xxx 自定义,也可通过req.session进行访问。parse方法是用来把cookie的字符串形式转换为json对象。

通过 if(!(req.headers.cookie && (req.sessionId = parse(req.headers.cookie).sessionId)))判断req.sessionId是否存在,如果不存在那么就创建一个并把sessionId信息写入到响应头发送给客户端。

最后,还要在index.js文件中加入:

exports.session = require("./lib/session");

有了session插件后,明天开发博客系统就有了保证,因为登录状态需要记录在session里。下一节,我们用session插件,做一个数字累加的例子。