问题今天准备使用node.js作为后端语言进行开发时,遇到了一个小坑。网上的资料还是比较少,所以决定记录一下。关于session和cookie我就不具体介绍了,网上的资料还是蛮多的。我打算实现的功能:登录。用户登录后,在session中保存用户的uname。在访问一些登录后需要访问的页面时,去session中检查该值是否存在。存在则已经登录,不存在则不登录(比较简单的功能)。但是发现登录后设置了req.session.user的值,立马发现可以获取到console.log(req.session.user)的值;跳转到另一个页面后,我再去请求req.session.user,发现这个值为空,不存在。剧透:此问题是由于跨域时存储在cookie中的数据丢失引起的。详见如下代码及效果:index.jsconsthttp=require("http")constexpress=require('express');constbodyParser=require('body-parser');constcookieParser=require('cookie-parser');constsession=require('快速会话');constcors=require('cors');constpool=require('./pool');constrouterUser=require('./router/user');letapp=express();http.createServer(app).listen(8081);//中间件app.使用(bodyParser.urlencoded({extended:false}));app.use(cors({origin:["http://127.0.0.1","http://localhost","http://127.0.0.1:8080","http://localhost:8080"],credentials:true}));app.use(cookieParser());app.use(session({secret:'logaawing',cookie:{maxAge:60000},resave:false,//每次请求是否需要重新设置cookiesaveUninitialized:true//是否有cookie,设置标记connect.sid可以重命名}));//routerapp.use('/user',routerUser);user.js//user.js在router目录下,和index.js同级constexpress=require('express')constpool=require('../pool.js');让router=express.Router();module.exports=router;router.post("/login",function(req,res){letuname=req.body.uname;letupwd=req.body.upwd;letsql="SELECTuser_nameFROMhome_adminWHEREaname=?ANDapwd=md5(?)";pool.query(sql,[uname,upwd],(err,result)=>{if(err)throwerr;if(result.length>0){username=result[0].user_name;req.session.user=username;console.log(req.session);res.json({errno:0,uname:username});}else{res.json({errno:1,msg:'登录失败,账号或密码错误'})}})})router.get("/session",function(req,res){console.log(req.session);res.send(req.session.user);})注意:我的两次访问是在同一个会话中。从图中可以发现,我在同一个session中再次访问session,发现session已经不是同一个session了,我保存进去的user也没了。如果有问题,我必须解决它。因为很久没学node.js了,session也用的不多。一开始我一直以为是我的session中定位错误导致了这个问题。后来记得有朋友跟我说nodejs里面session有一个坑,是跨域导致的。所以我朝这个方向努力寻找解决方案。解决session的工作流程:当浏览器访问服务器并发送第一个请求时,服务器会创建一个session对象,生成一个类似于key,value的键值对,然后将key(cookie)返回给浏览器(在client端,浏览器下次访问时,会携带key(cookie),找到对应的session(value),session中保存的是客户信息,问题原因:cookie中保存的数据是跨域时丢失,因为vue使用的是8080端口,而我用node.js启动的服务器使用的是8081端口,如果端口不一样就是跨域的问题,所以我在请求信息中添加了withCredentials:trueclient,也就是发起请求的时候需要带上cookie信息,我是用vue开发的,下面是vue中的方法(requestedwhenaddcredentials:true):一般的ajax请求,加上$.ajax({xhrFields:{withCredentials:true}});经过以上修改,可以发现在同一个session中再次访问session时,user值并没有丢失。以上就是我在node.jsexprees框架中使用session遇到的问题及解决方法。如有不妥之处,请指出,谢谢!
