express-session
express-session是在node服务端建立会话(session)的中间件。会话存储的实现可使用redis、mongodb、sql serve等,具体可看官方文档http://www.expressjs.com.cn/en/resources/middleware/session.html
如何查看所有的会话信息
express-session文档里面有这么一个属性store,这个属性提供了好几个回调函数。
原文:
store说明
翻译后:
翻译后store回调函数
要获取所有的会话可通过 store.all()方法进行获取,但是官网没看到具体怎么使用store这些回调函数的。
以下是我通过查询网上一些相关资料和看nodejs返回的requist分析的。
使用案例
- 建立会话
我只粘贴了部分代码,我使用的是redis来作为会话数据(session)的存储。
var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var multer = require('multer');
let session = require('express-session');
var helmet = require('helmet');
let RedisStore = require('connect-redis')(session);
let redisClient = require('./db/redis');
app.use(session({
secret: 'session-abc', // 建议统一命名,尽量复杂 同一个名字,可以实现session共享
name: 'session-abc', // 建议统一命名,尽量复杂,同一个名字,可以实现session共享
saveUninitialized: false,
resave: false,
unset: 'destroy',
maxAge: 24 * 60 * 60 * 1000,
cookie: { maxAge: 24 * 60 * 60 * 1000 },
store: new RedisStore({
client: redisClient,
ttl: 24 * 60 * 60,
prefix: 'node-session'
})
}));
- 获取所以会话信息,以及查询其他session、修改其他session
以下,我是做同一个用户只能一个人登录,新登录的会把旧登录的给挤掉。store. set()
方法并不能修改其他用户的信息,仅修改的是store里面这个session的值。如果要修改其他的信息,可直接修改redis里面的值
// 获取所有已存在的session-store,req.sessionStore就相当express-session官网中的store
req.sessionStore.all(function(err,sessions){
if(err){
console.log('sessionStore-err',err)
}
// 过滤和当前用户id匹配的session
sessions.filter(item =>{
// 匹配所有和当前用户id相同的session(不包括自身session)
if(item.user && item.id != req.sessionId){
return item.user.user === req.session.user.user
}else{
return false;
}
return item
}).map(item =>{
// 去除所有和当前用户的id相同的session.user(用户信息)
// 获取旧的session
req.sessionStore.get(item.id,function(err,se){
if(err) return console.log('sessionStore-get',err)
console.log('需去除重複的session',se);
delete se.user;
// 修改其他的session
req.sessionStore.set(se,function(error){
if(err) return console.log('sessionStore-set',err)
})
});
return item
});
})
如有不足,请多指教
网友评论