NodeJS Express中无法获取到存储到session中的值
Express是一个NodeJS的Web框架,类似rails是ruby的web框架。关于Express这里不多介绍,这几天使用Express的session功能的时候时,遇到一个session属性丢失的问题,在这里分享一些经验。
我们首先看Express中session的官方的sample code
// first:
// npm install redis
// redis-server
var express = require( ../.. );
var app = express();
app.use(express.logger( dev ));
// Required by session() middleware
// pass the secret for signed cookies
// (required by session())
app.use(express.cookieParser( keyboard cat ));
// Populates req.session
app.use(express.session());
app.get( / , function(req, res){
var body =
if (req.session.views) {
++req.session.views;
res.send(body + p viewed strong + req.session.views + /strong times. /p );
} else {
req.session.views = 1;
body += p First time visiting? view this page in several browsers :) /p
res.send(body + p viewed strong + req.session.views + /strong times. /p );
}
});
app.listen(3000);
console.log( Express app started on port 3000 );
在运行之前,需要了解几点:
我遇到的问题是,在登录请求中,使用session的 regenerate方法创建一个全新的session:
function login(request, response){
…
request.session.regenerate( function(){
request.session.username = userInfo.username;
console.log( set session username = + request.session.username);
console.log(request);
response.write(JSON.stringify(loginResult));
response.end();
} );
}
然后,在登录后的其他请求中,判断request.session.username是否存在,但是获取不到,request.session.username is undefined.
这个问题困扰了我3个早上,我排查了各种可能:
我不清楚session存在内存中是否有问题,那时候我还没有跑Express session的官方sample,后来在官方sample的代码中,我得知这个是不会有问题的。在这之前,我尝试过使用redis去存储session,后来我认为使用数据库太重量了不可接受接,所以放弃了。 我怀疑过是否是query的ajax请求方式没有将session中的cookie传递到后台,通过谷歌(感谢谷歌)我发现了cookie属性path,如果设置为了/,那么所有请求都会发送这个cookie,通过抓包也看到了有cookie。 由于client有发送,但是服务端没有接收到,我的逻辑中有请求跳转,是否是跳转后session被重置了?我就开始观察每个请求的session,通过打印出每个请求的session信息,终于观察到了,每次登录后,都是一个空的session将之前产生的session覆盖了: sessionStore:
{ sessions:
{ c+bFzYy2z23b8b3Wa+fV6nCO : { cookie :{ originalMaxAge :null, expires :null, httpOnly :true, path : / }} ,
fk8DJoqGwOyrQ4jiFfWu4hry: { cookie :{ originalMaxAge :null, expires :null, httpOnly :true, path : / }, username : Lucy } ,
sJJycHWSy+JANARqVUw4Jhl0 : { cookie :{ originalMaxAge :null, expires :null, httpOnly :true, path : / }} ,
这个问题,我最终的建议是:使用app.use(express.favicon());方法,给session赋值的时候,不要使用request.session.regenerate( function(){方法重建session。
本文链接:http://www.yunweipai.com/2768.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/53191.html
javaRedis相关文章
- 深入剖析nodejs中间件
- Crawlab 支持Nodejs爬虫插入数据
- Ubuntu16.04安装ros_nodejs安装教程
- 在你的ios、android应用中嵌入官方版nodejs是什么感觉?
- 细说nodejs的path模块
- Scrapy爬虫框架_nodejs爬虫框架对比
- 用 nodejs 实现 http 服务版本的 hello world
- nodejs中的方法和模块的使用详解编程语言
- NodeJS Stream 二:什么是 Stream详解编程语言
- Nodejs快速操作Oracle(node操作oracle)
- nodejs实用示例缩址还原
- 将nodejs打包工具整合到鼠标右键的方法
- Nodejs进程管理模块forever详解
- nodejs文件操作模块FS(FileSystem)常用函数简明总结