简介express-session是express中的一个session处理中间件,可以说是express中最常用的中间件之一。由于session管理依赖cookies的使用,所以其api中有很多部分是控制cookies的。总的来说,express-session有以下特点:session管理(基本功能)cookie签名可以替代持久化存储模块。本文使用的版本是1.15.6。安装npminstallexpress-session--savetoimport&useconstexpress=require('express');constapp=newexpress();constexpressSession=require('express-session');//使用express-sessionapp。use(expressSession({secret:'helloworld',//cookie签名属性是必须的,具体配置同`cookie-parser`。saveUninitialized:true,//是否自动初始化默认为trueresave:false,//当用户session没有变化时,cookie仍然自动保存:{//cookie信息的具体操作同`cookie-parser`maxAge:1800000//30分钟后过期},rolling:true//每次请求时覆盖cookie}))session介绍在express-session文档中有如下声明:注意session数据本身并没有保存在cookie中,只是sessionID。会话数据存储在服务器端。Session中包含的数据不会保存在cookie中,cookie中只保存一个SessionId。实际会话数据保存在服务器端。简单理解就是一个Map,key对应cookie中保存的sessionid值,value对应用户在服务器端保存的数据。API引入参数来创建express-cookie参数。有两种。ForcookiesettingsForexpress-sessionsettingscookiesettingslist:app.use(expressSession({secret:'helloworld',//cookie签名必须有否则会报错cookie:{domain:,expires:,httpOnly:,path:,sameSite:,secure:,maxAge:1800000}}));而这些对应的参数是server-sideforcookie关于各个参数的含义可以参考下面这篇文章:https://developer.mozilla.org...express-session部分设置:app.use(expressSession({secret:'helloworld',//cookie签名必须有,否则会报错genid:function(request){//用于替换默认ID生成的函数第一个参数reqeustreturn'randomid'},name:'connect.sid',//每次响应中从cookie开始的内容,默认开始是`connect.sid`,proxy:true,//对cookie使用secure后,反向代理server在传输过程中是可信的,默认是undefined,只有正向的proxyresave:true,//在一个session中,无论session是否发生变化,都会强制存储一个新创建的未修改的session,默认为truestore:object//一个存储对象,默认为`MemoryStore`thisstorageunset:'keep'//控制当`req.session`没有设置时的行为(使用deletedeleteorassignnull),默认'keep'session不会被保留,'destroy'session完成后会被删除。}));request.session上挂载的session对象,除了你添加的内容外,还有一个默认的方法:req.session.regenerate(function(err){//调用这个方法重新生成一个新的session,完成后触发})req.session.destroy(function(err){//删除本次会话,完成后触发})req.session.reload(function(err){//重新加载会话数据,完成后触发回调})req.session.save(function(err){//使用当前内存中的数据保存到存储中//默认情况下,该方法会在会话结束时自动调用})req.session.touch()//更新cookie中的maxAge,一般不需要手动操作,middleware属性也在session实例上还有很多属性:req.session.id//保存唯一的sessionid值,不可修改req.session.cookie//以键值对的形式保存cookie的原始数据以毫秒为单位返回剩余存活时间req.sessionID//保存唯一的sessionid,只读一个简单的例子一个简单的登录例子:constexpress=require('express');constapp=newexpress();constexpressSession=require('express-session');constuserDb=newMap();app.use(expressSession({secret:'helloworld',saveUninitialized:true,resave:false,cookie:{maxAge:1800000},rolling:true,}));app.get('/login',(request,response)=>{constid=request.query.id,pwd=request.query.pwd;if(id&&pwd){if(userDb.has(id+pwd)){response.send('用户已登录');}else{request.session.userId=id+pwd;userDb.set(id+pwd,id);response.redirect('/');}}else{response.send('请输入正确的帐号和密码');}});app.get('/logout',(request,response)=>{constuserId=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('404notfound');});app.listen(8888,'127.0.0.1');在浏览器中输入以下url,模拟登录行为:localhost:8888/localhost:8888/login?id=ASCll&pwd=123456localhost:8888/localhost:8888/logoutlocalhost:8888/运行完上面的例子我就黑坑了在chrome浏览器下多次,发现问题。浏览器将预读网页以提高性能。就是说,当我在浏览器的下面这个地方输入网址:localhost:8888/logo根据我已经多次进入这个页面。浏览器会提前访问localhost:8888/logout这个页面,导致服务器直接删除session。我真正进入页面的时候,是第二次加载页面,导致每次退出都显示。失败的。希望有经验的朋友能给个合理的解决办法。注意当express-session和cookie-parser一起使用时,cookie的签名必须保持一致。express-session的存储实例可以替换,默认使用MemoryStore。它仅适用于测试和开发。生产环境必须使用其他存储实例,否则会出现内存碎片问题。官方文档给出了实现的接口,可以连接redis、mongodb等数据库。列表在官方文档最后:npm地址