2011-03-12 142 views
19

我正在使用Express和連接中間件的全功能用戶註冊/身份驗證系統。Node.js服務器重新啓動會話丟失

app.use(express.session({store: require('connect').session.MemoryStore({reapInterval: 60000 * 10}) })) 

唯一的問題是每次執行服務器重新啓動時會話都會丟失。

https://github.com/remy/nodemon - 並且nodemon每次檢測到文件更改時都會重新啓動node.js。

我該如何持久會話?

+0

我想知道如何使用JWT而不是使用數據庫的持久會話......? – 2015-11-22 08:37:31

回答

23

就像你的代碼告訴你正在使用MemoryStore一樣。這是易失性的,並在重新啓動時清除。我建議你使用connect_redis來堅持你的會話。 Redis是一家速度非常快的商店。

  1. 下載redis
  2. 編譯Redis的:make
  3. 啓動服務器:./redis-server
  4. npm install connect-redis
  5.  

    var connect = require('connect') , RedisStore = require('connect-redis'); 
    
    connect.createServer(
        connect.cookieParser(), 
        // 5 minutes 
        connect.session({ store: new RedisStore }) 
    ); 
    

這只是爲了讓你快速入門。如果你想充分利用redis,你應該閱讀文檔並配置redis。

+3

作爲連接1.0 cookieDecoder(的)現在cookieParser() – realgt 2011-03-31 12:16:41

+0

只是好奇,爲什麼你用ProperCase爲RedisStore,有沒有NodeJS約定/原因呢? – 2014-02-11 01:35:21

+0

@ClarenceLiu類名通常被選擇爲ProperCase(或CamelCase或你想調用它)。 – Domi 2014-04-30 11:51:11

1

當節點死亡時,我會想象你正在使用的內存存儲器。

將會話保存到磁盤?

+3

如Redis的處理中附加的工藝會話生存節點崩潰和節點重新啓動會話,如果Redis的下降,會話下去相應 – ezmilhouse 2012-03-05 12:31:09

5

另外,如果您使用快遞,則在告訴應用程序使用Redis中間件時需要提供一個祕密。

,請按照阿爾弗雷德的食譜中,但執行下列操作...

var express = require('express'); 
var RedisStore = require('connect-redis'); 

app.use(express.cookieParser()); 
app.use(express.session({ secret: "keyboard cat", store: new RedisStore })); 
+0

現在你需要添加require('connect-redis')(express) - 否則你會得到一個TypeError:無法讀取未定義的屬性'會話'。 (https://github.com/visionmedia/connect-redis/issues/24) – 2013-03-12 22:22:20

14

我試圖讓Redis的使用express.js軌道,谷歌派我到這裏。快遞執行已更改:

var express = require('express'), 
RedisStore = require('connect-redis')(express); 

另一個重要的事情是快遞配置的順序。

app.configure(function(){ 

    app.enable('strict routing'); // removes trailing slash 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jqtpl'); 
    app.register('.html', require('jqtpl').express); 
    app.use(express.favicon()); 
    app.use(express.methodOverride()); 
    app.use(express.compiler({src: __dirname + '/public', enable: ['sass']})); 
    app.use(express.static(__dirname + '/public')); 
    app.use(app.router); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: _.config.secret, store: new RedisStore})); 

}); 

cookieParser &會話配置需要在配置的結束,cookieParser必須express.session前右側放置。

希望有幫助,我遇到了這兩個問題。

相關問題