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', // 建議統(tǒng)一命名眉菱,盡量復雜 同一個名字馋辈,可以實現session共享
name: 'session-abc', // 建議統(tǒng)一命名,盡量復雜倍谜,同一個名字迈螟,可以實現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
});
})
如有不足,請多指教