express express-session的使用小结

2020-06-17 06:12:13易采站长站整理

}

});

app.get('/logout',(request, response)=>{

const userId = request.session.userId;

request.session.destroy((err)=>{

if(err || !userDb.has(userId)){
response.send('登出失败');
}else{
userDb.delete(userId);
response.send('登出成功');
}

});

});

app.get('/',(request, response)=>{
if(request.session.userId && userDb.has(request.session.userId)){
response.send(`欢迎回来${userDb.get(request.session.userId)}`);
}else{

response.send('还未登录');
}
});

app.use((request, response) => {
response.send('404 not found');
});
app.listen(8888, '127.0.0.1');

在浏览器中依次输入以下url来模拟登录行为:


localhost:8888/
localhost:8888/login?id=ASCll&pwd=123456
localhost:8888/
localhost:8888/logout
localhost:8888/

暗坑

我在chrome浏览器下运行上面的例子多次后发现一个问题,浏览器会进行预读取网页来提高性能,也就是说在浏览器中当我url输入到如下的地方时:


localhost:8888/logo

根据我之间多次进入这个页面浏览器会提前访问这个页面

localhost:8888/logout
,而导致服务器直接删除
session
等到真正进入到页面的时候已经是第二次加载页面了,导致每次登出都显示失败.

希望有经验的朋友能给出一个合理的解决方案.

注意

express-session
cookie-parser
一起使用的时候对于
cookie
的签名必须一致.

express-session
的存储实例是可以更换的,默认使用
MemoryStore
只适合于测试和开发使用,生产环境必须要使用其他的储存实例,否则会出现内存碎片问题,在官方文档中给出了已经实现的接口,可以对接
redis
以及
mongodb
等数据库.

该列表在官方文档的最后:

npm地址