前言:
本次从问题发现到解决历时1day,精力投入5—7小时,感谢给我提供帮助的Noder(193572405)群 的朋友提供的帮助,特别鸣谢 冰 给的帮助鼓励和支持。这么长时间Debug,收获了很多解决方法和思路,在此谈谈感受。
问题:
在按照教程的时候使用session模块的时候发生了错误,错误如图,在修改route规则之后,访问主页出现了这种问题,下面我马上就进入了排错环节。
分析:
由于刚修改了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
启动项目的时候就报了这个,当时没在意这个… 冰 说可能在一开始就存在错误, 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的依赖包到最新版本,测试后仍然报错。就在我各种头疼之时 冰 给我带来了鼓励的话语:
此时,我的内心是怎么样的…..好了不鸟他了,继续看,我怀疑是新特性的问题所以我到express-session这个中间件这里看看代码,官网的代码很简单就设置了一个cookie的过期时间,我复制到app.json里,刷新页面…竟然正常了,我对比它的设置和我的设置最后发现这么个问题…..没错,你看上面的代码,此处略去很多代码,其中有一个是route(app);也就是路由规则,我跨越路由规则去设定session怎么会写进去呢?…………
等我把他们移到一起,刷新页面萌萌的成功了,这次Debug历时5小时(连续),所以说遇到问题问百度,像node这样百度资料也很少的语言,就要靠自己的桌面和坚持了。