2012-02-26 6 views
10

Próbowałem użyć standardowego wytrwałości sesji z Redis w NodeJS: „Nowa sesja”NodeJS Redis połączyć ID sesji jest regenerowany gdy powinna pozostawać utrzymywały

var express = require('express'); 
var RedisStore = require('connect-redis')(express); 
var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
    secret: "keyboard cat", 
    store: new RedisStore, 
    key: 'sid' 
    })); 
}); 


app.get('/', function (req, res) { 
    if (req.session.isValid) { 
    console.log("There is an existing session."); 
    } 
    else { 
    req.session.isValid = true; 
    console.log("New session."); 
    console.log('Old session ID: ' + req.header('Cookie')); 
    console.log('New session ID: ' + req.session.id); 
    } 

    res.render('index', {'title': s}); 
}); 
app.listen(4000); 

Teoretycznie powinienem zobaczyć linię raz i wszystkie kolejne wywołania strony internetowej powinny prowadzić do "Istnieje już sesja". Niestety przy każdym wywołaniu regenerowany jest nowy identyfikator sesji. Cookie w przeglądarce działa poprawnie, treść jest poprawnie przekazywane i widzę go w

req.header('Cookie') 

To właśnie dziennik konsola wygląda następująco:

[app.js] New session. 
[app.js] Old session ID: undefined 
[app.js] New session ID: nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE 
[app.js] New session. 
[app.js] Old session ID: sid=neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO%2FxykJPN5R5tjAlQc 
[app.js] New session ID: FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ 
[app.js] New session. 
[app.js] Old session ID: sid=pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme%2BJh8sQC6%2FzEE 
[app.js] New session ID: KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI 

Jednocześnie otrzymuję następujące dane wyjściowe podczas uruchamiania komendy "Monitor" w Redis-cli:

sess:nuoHKZj2j0AoRkvqT4xE5h6W.zF+DNv2rzr3kpeO2IyD7sa4xdamFQMugjfQvY6OYymE 
*2 
$3 
get 
$73 
sess:Q6Z06GL4hdRytKA2MToCIgVw.JWxImSB/m20Urn+IYMQqnNqfQp4ygAESiyBLORn3Iuo 
*2 
$3 
get 
$73 
sess:neLUc5PXxPoj1yFqukerv49x.BHzYKiuAfFSNHKd4fCAkv8wNwZO/xykJPN5R5tjAlQc 
*2 
$3 
get 
$73 
sess:FvuzjnXvchCkmVqsq5mrodL2.5YlT3InfTbvOwEUc0dNpPLT77tcdJpNuhbFGVYkLneQ 
*2 
$3 
get 
$73 
sess:zvCWdwzowgAfl6jH8m0D31vL.b5tK5VZUJtPHrdvH09A/hjhjoOg6bT0CmAcWWRf99SI 
*2 
$3 
get 
$73 
sess:pFbyVdlNZXtF5vZ35CW9sfmq.nJ1RBjJu59iUJJjmZv9TCYiYLcvycme+Jh8sQC6/zEE 
*2 
$3 
get 
$73 
sess:KdPhwqwwgmOnPZEuVapy7EJe.I0TGT9HSSQQSporwCNsxl11rXDxR/ysjTeZb0lD5uwI 
*2 
$3 
get 
$73 
sess:r793eaJyOnaq2RNyw1Hmpuwv.xnonbOlaWEAlpz+LDg0SHcUeAa0sbjyw0oIcwFmlX0w 

gdy używam MemoryStore insteand z RedisStore, wszystko działa tak jak oczekiwano.

Wszelkie pomysły?

+0

HI Raph - rozwiązałeś to? Mam ten sam problem:/ – UpTheCreek

+0

Wygląda na to, że uaktualnienie do nowszej wersji Redisa rozwiązało problem. Ale wciąż nie wiem, skąd się wziął ten problem. – Raph

Odpowiedz

0

Miałem podobny problem. Moja sesja była odnawiana na każde żądanie. Rozwiązałem go, ustawiając odpowiednią datę na maszynie wirtualnej, na której odbywa się programowanie.

+0

Czy masz na myśli, że między maszyną wirtualną aplikacji a maszyną Redis była inna data? Jak duża była ta rozbieżność? – UpTheCreek

-1

Miałem ten sam problem, gdy sesje zostały zregenerowane na każde żądanie. Powodem było to, że "statyczne" oprogramowanie pośrednie zostało umieszczone poniżej "sesji" jeden. Tak więc, należy umieścić middleware w odpowiedniej kolejności, tj:

... 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.session({ store: new RedisStore({ prefix: 'sid_' }) })); 
app.use(app.router) 
app.get ... 

„express.session” middleware powinny być pod „statyczne”.

Powiązane problemy