2012-12-23 28 views
30

我正在嘗試將Redis會話集成到Node.js中編寫的身份驗證系統中。如何從Redis保存和檢索會話

我已經能夠成功地設置Redis服務器,connect-redis和Express服務器。

這裏是我的設置(只是重要的一點):

var express = require("express"); 
var RedisStore = require("connect-redis")(express); 
var redis = require("redis").createClient(); 

app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: "thisismysecretkey", 
    store: new RedisStore({ host: 'localhost', port: 6379, client: redis }) 
})); 

現在......實際上,我怎麼創建,讀取和刪除會話?我已經閱讀了大量關於如何在這裏設置connect-redis和許多問題的文章,但是我發誓每個人只停留在配置上,並沒有解釋如何實際使用它...

我知道那是可能非常簡單,但請不要downvote,只是解釋:)。

回答

19

這應該就是它的全部。您可以通過req.session訪問路線處理程序中的會話。會話是自動創建,保存和銷燬的。

如果您需要爲用戶手動創建新會話,請致電req.session.regenerate()

如果您需要手動保存,您可以撥打req.session.save()

如果您需要手動銷燬它,可以撥打req.session.destroy()

有關方法和屬性的完整列表,請參見the Connect documentation

4

考慮這段代碼。

var express = require('express'); 
var redis = require("redis"); 
var session = require('express-session'); 
var redisStore = require('connect-redis')(session); 
var bodyParser = require('body-parser'); 
var client = redis.createClient(); 
var app = express(); 

app.set('views', __dirname + '/views'); 
app.engine('html', require('ejs').renderFile); 

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

app.get('/',function(req,res){ 
    // create new session object. 
    if(req.session.key) { 
     // if email key is sent redirect. 
     res.redirect('/admin'); 
    } else { 
     // else go to home page. 
     res.render('index.html'); 
    } 
}); 

app.post('/login',function(req,res){ 
    // when user login set the key to redis. 
    req.session.key=req.body.email; 
    res.end('done'); 
}); 

app.get('/logout',function(req,res){ 
    req.session.destroy(function(err){ 
     if(err){ 
      console.log(err); 
     } else { 
      res.redirect('/'); 
     } 
    }); 
}); 

app.listen(3000,function(){ 
    console.log("App Started on PORT 3000"); 
}); 

所以,你需要安裝連接,Redis的和你快遞會話實例傳遞給它。

然後在中間件中用這樣的服務器細節初始化redisStore。

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 

我把ttl增加到260,你可以增加。 TTL達到極限後,它會自動刪除redis密鑰。

在路由器中,您可以使用req.session變量來設置,編輯或銷燬會話。

一件事...

如果你想定製的cookie即不是一樣在你的Redis的商店,你可以使用cookie的解析器來設置cookie的祕密。

希望它有幫助。

鏈接:https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/