2016-06-19 137 views
1

我使用Express 4.13.1和Redis作爲會話存儲。使用Redis存儲的快速會話無法創建會話

app.use(session({ 
    store: new RedisStore, 
    secret: '...', 
    resave: false, 
    saveUninitialized: true 
})); 

它起初工作,但它沒有工作(在升級node.js後)。使用默認存儲(內存)工作正常,但使用RedisStore,會話不會被創建。這是創建會話的代碼:在那一刻

router.post('/admin/login', (req, res, next) => { 
    Auth.compare(...,() => { 
     req.session.authorized = true; 
     req.session.userId = id; 

     console.log(req.session); // It prints well. Session is created 

     res.redirect('/admin/main'); 
    }); 
}); 

,會議改爲:

Session { 
    cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    authorized: true, 
    userId: '...'} 

但在此之後,未創建會話:

router.get('/admin/main', (req, res, next) => { 
    console.log(req.session); 
    ... 
}); 

打印會話:

Session { 
    cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true } 
} 

我用過sessio n.save手動,但它不起作用。我錯過了什麼?

+1

@FurkanO感謝您修復我的話。 – modernator

回答

1

在使用redis時,可能會檢查應用程序中的幾個點以解決此類問題。首先,檢查瀏覽器是否獲取cookie,例如通過檢查資源 - >瀏覽器上的cookies

  • 檢查到期日期並在那裏查看會話ID。

其次,檢查相應的鍵Redis的,如果項存在,並且鍵的從期滿redis的-CLI

  • 所有鍵:keys *

  • 值由鍵:get key (sess:PMlu4s1PYHnSZXBMSoJGLgjNSGXq_s-g is a key for me)

  • 檢查您的密鑰何時過期:ttl key

有可能是下列問題之一:

  • 你可能已經配置Redis的不適當
  • 你可能已經配置Redis的TTL不當,例如 您的TTL值應該是在幾秒鐘內,而cookie maxAge在 毫秒。

而不是要求您的server.js代碼,我建議您按照這些步驟檢查是否所有過期都沒問題,或者至少創建會話。

+0

我在瀏覽器上檢查了cookies,並且創建的很好。而Expires/Max-Age的值是「Session」< - 我不知道這意味着什麼。我使用默認過期(在快速文檔說,它使持久性cookie,我想用這個)。此外,我正在使用Redis存儲的默認參數,並且從未更改或配置。 – modernator

+0

我想這個問題是你的redis配置。你可以嘗試檢查redis-cli中的redis是否有相同的sessionid。 – FurkanO

+0

我剛剛檢查過redis,並獲取所有密鑰返回**(空列表或設置)**。我安裝後沒有配置redis。爲什麼會這樣呢? – modernator