小白请教nodejs session的使用
发布于 2年前 作者 dongmu 7199 次浏览

刚接触nodejs 没多久,目前在做自己的第一个nodejs项目,请教各位大神,session如何使用,有没有合适的插件

5 回复

目前使用大家都推荐的express 。正在研究 如何清空session实现 logout

我的例子:

    block.logout = function(req, res){
        delete req.session.user;
        res.redirect('/');
    };

为什么总是提示 cannot set property ‘user’ of undefined

我在app.js 引用了 app.use(express.session({}));

在index.js的app.post('/reg’,function(req,res){ … req.sesstion.user=newUser; … })

我没有使用框架,在假设活动用户不太多(如企业应用)的情况下,直接写了个常驻内存的session对象,因为简单,感觉效率非常高。代码摘录如下,供参考(本人是新手,老鸟勿喷): //session.js module.exports=function(){ var sql=require(‘msnodesql’).query; //我使用SQL Server var conn_string=require(‘./configure’).sqlConnectionString; var querystring=require(‘querystring’); var sessions=[]; this.isInSession=function(req){ if(!req){return false;} if(sessions.length<=0){return false;} var id=objectifyUpComingCookie(req).raw2_uid; for(var i=0;i<sessions.length;i++){ if(sessions[i]==id){return true;} } return false; } ; this.addSession=function(id){ if(!id){return null;} if(this.isInSession(id)){return id;} sessions.push(id); return id; }; this.deleteSession=function(id){ sessions=sessions.splice(id); } ; this.signOut=function(req){ this.deleteSession(objectifyUpComingCookie(req).raw2_uid); }; this.signIn=function(req,cb){ var t=this; var info=’’; req .on('data’,function(chunk){info+=chunk;}) .on(‘end’,function(){ info=querystring.parse(info); var sql_string="SELECT id,name FROM users WHERE name=’"+info.uname+"’ AND password=’"+info.pwd+"’"; //开发阶段,此处暂未加密处理,请勿喷 sql(conn_string,sql_string,function(error,data){ if(data){ t.addSession(data[0].id); cb(null,data); } else{ cb(error); } }) ; }); } ;

    function objectifyUpComingCookie(req){
        var _cookies = {};
        req.headers.cookie && req.headers.cookie.split(';').forEach(function( Cookie ) {
            var parts = Cookie.split('=');
            _cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
        });
        return _cookies;
    }

}

用法为: //app.js var session=new (require(‘./session’))(); http.createServer(function(request,response){ route(request,response,session); }).listen(3000);

//route.js module.exports=function(req,res,session){ case '/signin’: session.signIn(req,function(err,rlt){ if(err==null){ returnFile('content/index.html’,res,{"Set-Cookie":"raw2_uid="+rlt[0].id+";maxAge=3600000","Context-Type":"text/plain"}); // 登录成功,redirect到主页,同时向客户端增加cookie } else{ returnFile('content/signin.html’,res); } }); break; case '/signout’: session.signOut(req); returnFile('content/signin.html’,res,{{"Set-Cookie":"raw2_uid="+rlt[0].id+";maxAge=0","Context-Type":"text/plain"}}); //登出,redirect到登录页,同时销毁客户端cookie break; default : //其它路径请求,总是先检查cookie是否在session里,如果不在,redirect到登录页 if(session.isInSession(req)){ //go ahead… …

        } else{
            returnFile('content/signin.html',res);
        }
        break;

}

接下来,打算将authentication放到session.js里,从视图可视、行为限制和数据组限制三个方面设定和管理用户权限。

回到顶部