2014-12-21 67 views
3

我正在嘗試使用connect-redis的快速會話來存儲用戶會話。目前,在用戶登錄後,我返回req.sessionID,然後每當用戶想要向api的安全部分發出請求時,他/她必須提供會話ID。認證中間件然後返回到redis並檢查會話是否存在,如果是,則將當前會話替換爲存儲在Redis中的會話。req.session沒有方法'touch'?

function isLoggedIn(req, res, next){ 
    var session_id = req.body.session_id; 
    if (!session_id){ 
    res.send(401, {status: 0, message: "Not authorized"}); 
    return; 
    } 
    console.log(req); 
    sessionStore.get(session_id, function(err, session){ 
    if(err){ 
     res.send(401, {status: 0, message: "Not authorized"}); 
     return; 
    } 
    req.session = session; 
    req.sessionID = req.body.session_id; 
    return next(); 
    }); 
} 

但由於某些原因,這個錯誤顯示出來:

/node_modules/express-session/index.js:269 
    req.session.touch(); 
      ^
TypeError: Object #<Object> has no method 'touch' 

我似乎無法找到任何人在網上有這個錯誤,因爲觸摸()是一個內置的功能來express-會話。請幫忙?我的快速會話版本是1.9.3。

+0

我一直有同樣的問題幾天。我使用的是較舊版本的Express 3.x,但即使升級到4.x後,問題仍然存在 –

回答

7

我有同樣的錯誤。看起來,如果您是來自快速cookie會話,則可以設置req.session = {/* some arbitrary session object */}。顯然,req.session在表示需求的實例上有一些方法。

所以,只要確保你沒有明確地覆蓋代碼中任何地方的req.session

+0

非常感謝。我確實需要重寫當前會話,但我會找到另一種方法來完成它。 – josneville

+0

你只需要重寫會話中的有意義的屬性:'req.session.user = {/ * ... * /}' –

0

我能夠通過使用cookie解析器中間件使用Cookie的會話中間件之前解決此問題:

var express = require('express') 
var cookieParser = require('cookie-parser'); 
var cookieSession = require('cookie-session'); 

var app = express(); 
app.use(cookieParser()); 
app.use(cookieSession()); 

測試在快遞4