Noder 记一次漫长的Debug过程,讲讲收获。

Nodejs cyanprobe 8年前 (2015-12-19) 4370次浏览 已收录 3个评论

前言:

本次从问题发现到解决历时1day,精力投入5—7小时,感谢给我提供帮助的Noder(193572405)群 的朋友提供的帮助,特别鸣谢 冰 给的帮助鼓励和支持。这么长时间Debug,收获了很多解决方法和思路,在此谈谈感受。

问题:

在按照教程的时候使用session模块的时候发生了错误,错误如图,在修改route规则之后,访问主页出现了这种问题,下面我马上就进入了排错环节。
error

分析:

由于刚修改了route规则,我先访问/reg (另一个页面),结果页面正常,接下来我锁定关键词 “error “在新修改的规则中没有找到这个关键词 是返回flash报错信息,后面的地址是views文件夹,由此我想到是不是发生了HTTP500错误,后面的view是不是因为我没有error.html文件,于是我把err.html修改成error.html并在其中添加了任意的文字,重新访问根目录,页面被成功刷新成error.html。
好了,现在基本可以确定为HTTP500错误,我开始对路由规则进行排查,最后发现注释掉下面内容可以正常访问:

app.get('/', function(req, res){
res.render('index', {
title: '主页',
user:req.session.user,//注释1
success:req.flash('success').toString(),//注释2
error: req.flash('error').toString()//注释3
});
});

接下来的排错是逐个注释,最终发现只有全部注释掉页面才可以正常访问,这让我想到可能是view渲染的时候出错了,可能因为我对node的<%%>等渲染不熟悉导致的错误,我注释掉2,3 ,index.html只保留了 <%= title%>。运行,报错依旧。这时理所当然想到了session问题,然后我求助了  ,大神抽出时间给我看了看,这时候我注意到这个。 express-session deprecated undefined ******* || express-session deprecated req.secret 
ERRME
启动项目的时候就报了这个,当时没在意这个… 冰 说可能在一开始就存在错误, deprecate 翻译:不支持 。好了看看大体的意思,前两行是没有定义 resave 选项,没有定义 saveUninitialized (储存初始化),最后一行的意思是:不支持 secret 选项。 解决方案到app.js中修改session如下

var session=require('express-session');
var MongoStore=require('connect-mongo')(session);
//此处略去很多代码
//^^^^^^^^^
route(app);
//^^^^^^^^^
app.use(session({
secret:settings.cookieSecret,//原来引用错了settings里的加密字符串
key:settings.db,
cookie:{maxAge:1000*60*60*24*30},//生存周期30天。
store:new MongoStore({
db:settings.db,
host:settings.host,
port:settings.port
}),
resave:false, //添加此属性  resave : 是指每次请求都重新设置session cookie,假设你的cookie是10分钟过期,每次请求都会再设置10分钟
saveUninitialized:true //添加此属性  是指无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid
}));

用npm start 重启项目,这时候发现命令行已经不再报错,我们来看一看主页,发现错误依旧,难道是express的新特性这老版本不行了?我改了package的依赖包到最新版本,测试后仍然报错。就在我各种头疼之时    给我带来了鼓励的话语:
bing
此时,我的内心是怎么样的…..好了不鸟他了,继续看,我怀疑是新特性的问题所以我到express-session这个中间件这里看看代码,官网的代码很简单就设置了一个cookie的过期时间,我复制到app.json里,刷新页面…竟然正常了,我对比它的设置和我的设置最后发现这么个问题…..没错,你看上面的代码,此处略去很多代码,其中有一个是route(app);也就是路由规则,我跨越路由规则去设定session怎么会写进去呢?…………
等我把他们移到一起,刷新页面萌萌的成功了,这次Debug历时5小时(连续),所以说遇到问题问百度,像node这样百度资料也很少的语言,就要靠自己的桌面和坚持了。
 


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Noder 记一次漫长的Debug过程,讲讲收获。
喜欢 (2)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 我也遇到过类似的session警告,大概是旧的属性在新的版本中已经不支持了。Nodejs更新的速度太快了。
    leoskey2016-05-13 12:58 回复
  2. 并且在新的版本中,一定要添加某些属性,就如你所遇到的。
    leoskey2016-05-13 12:59 回复
  3. 文章写的不错
    卡西欧手表2016-05-19 14:44 回复