2012-02-26 26 views
10

tôi cố gắng sử dụng kiên trì chuẩn của phiên với Redis trong NodeJS: "phiên New"redis NodeJS kết nối session ID được tái sinh khi nó nên ở lại vẫn kiên trì

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); 

Về lý thuyết tôi sẽ thấy dòng một lần và tất cả các cuộc gọi tiếp theo của trang web sẽ dẫn đến "Có một phiên hiện tại". Thật không may trên mỗi cuộc gọi một ID phiên mới được tạo lại. Cookie trong trình duyệt đang làm việc tốt, nội dung được truyền một cách chính xác và tôi có thể nhìn thấy nó trong

req.header('Cookie') 

Đây là những gì console log trông giống như:

[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 

Cùng lúc đó tôi nhận được đầu ra sau khi chạy lệnh "MONITOR" trong 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 

Khi tôi sử dụng MemoryStore insteand của RedisStore, mọi thứ hoạt động như mong đợi.

Bất kỳ ý tưởng nào?

+0

HI Raph - bạn đã giải quyết vấn đề này chưa? Tôi đang gặp vấn đề tương tự:/ – UpTheCreek

+0

Có vẻ như việc nâng cấp lên phiên bản Redis mới hơn đã thực hiện thủ thuật. Nhưng tôi vẫn không biết vấn đề đến từ đâu. – Raph

Trả lời

0

Tôi gặp sự cố tương tự. Phiên của tôi đã được tạo lại theo mọi yêu cầu. Tôi đã giải quyết nó bằng cách thiết lập ngày thích hợp trên máy ảo, nơi phát triển diễn ra.

+0

Ý của bạn là có một ngày khác nhau giữa máy ảo ứng dụng và máy ảo Redis? Sự khác biệt lớn đến mức nào? – UpTheCreek

-1

Tôi gặp vấn đề tương tự khi phiên được tạo lại theo mọi yêu cầu. Lý do là phần mềm trung gian 'tĩnh' được đặt bên dưới phần 'phiên'. Vì vậy, hãy chắc chắn đặt các phần tử trung gian theo thứ tự thích hợp, tức là:

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

'middle.session' middleware phải dưới 'tĩnh'.

Các vấn đề liên quan