2011-12-01 27 views
7

Tôi (gần như) đã sử dụng thành công Node.js với Express và Redis để xử lý các phiên.Node.js - Phiên không tồn tại qua res.redirect()

Sự cố tôi gặp phải là phiên không được lưu giữ khi tôi sử dụng res.redirect().

Dưới đây là làm thế nào tôi có thể nhìn thấy nó:

req.session.username = username.toString(); 
console.log(req.session); 
res.redirect('/home'); 

Các console.log() in:

{ lastAccess: 1322579131762, 
    cookie: 
    { path: '/', 
    httpOnly: true, 
    _expires: Tue, 29 Nov 2011 15:06:31 GMT, 
    originalMaxAge: 60000 }, 
    username: 'admin' } 

Bây giờ, đây là đoạn mã sau:

app.get('/home', [app.requireLogin], function(req, res, next) { 
// Not showing the rest as it's not even getting there 
// Instead, here is what's interesting 
app.requireLogin = function(req, res, next) { 
    console.log(req.session); 

này console.log() in ra điều này:

{ lastAccess: 1322579131775, 
    cookie: 
    { path: '/', 
    httpOnly: true, 
    _expires: Tue, 29 Nov 2011 15:06:31 GMT, 
    originalMaxAge: 60000 } } 

Rõ ràng, đối tượng 'tên người dùng' đã biến mất. Phiên này đã không giữ nó, và chỉ xây dựng lại một phiên mới.

Tôi làm cách nào để giải quyết vấn đề này? Đừng ngần ngại nếu bạn cần bất kỳ thông tin nào.

Đây là mã nơi tôi đặt quản lý phiên:

app.configure(function() { 
    // Defines the view folder and engine used. 
    this.set('views', path.join(__dirname, 'views')); 
    this.set('view engine', 'ejs'); 

    // Allow parsing form data 
    this.use(express.bodyParser()); 

    // Allow parsing cookies from request headers 
    this.use(express.cookieParser()); 
    // Session management 
    this.use(express.session({ 
    // Private crypting key 
    secret: 'keyboard cat', 
    store: new RedisStore, 
    cookie: { 
     maxAge: 60000 
    } 
    })); 
    this.use(app.router); 
}); 

Dưới đây là toàn bộ dự án (Ý tôi là, các bộ phận của nó), về ý chính: https://gist.github.com/c8ed0f2cc858942c4c3b (bỏ qua các thuộc tính của các quan điểm render)

+0

Bạn cũng có thể dán mã nơi bạn đang bao gồm cửa hàng phiên Redis không? Có một tùy chọn thời gian chờ ở đó, có thể bạn vô tình đặt nó quá thấp. – alessioalex

+0

Added :) Nó được đặt ở 60 giây, và tôi rõ ràng không sử dụng 60 giây để viết thông tin đăng nhập ... –

+0

Tôi cho rằng đây là một dự án nhỏ, tôi nghĩ tốt hơn nên đăng nó ở đâu đó (gist, pastie) và cung cấp đường dẫn. Tôi đặt cược lỗi là bằng cách nào đó trong một mã mà bạn không dán. (chỉ cần đoán) – alessioalex

Trả lời

6

Được rồi, tôi thấy giải pháp. Vấn đề là thời gian trong maxAge đã được thêm vào ngày hiện tại. Vì vậy, ở phía trình duyệt, cookie đã được đặt hết hạn vào thời điểm GMT được hiển thị.

Vấn đề là như sau: Tôi sử dụng một máy ảo để kiểm tra node.js, và, bạn biết đấy ... đôi khi, bạn đình chỉ máy của bạn.

Vâng, điều xảy ra là thời gian của máy trễ hai ngày. Vì vậy, bất cứ khi nào cookie được đặt ở phía máy chủ, phía máy khách cho rằng cookie đã hết hạn, vì máy chủ của tôi không trễ hai ngày.

Một kết quả ngu ngốc khác.

1

Mã của bạn trông khá chắc chắn, nhưng có lý do nào bạn đang sử dụng client.end() không? Nó buộc phải đóng kết nối lại và không sạch. Tôi không nghĩ rằng bạn cần nó ở tất cả:

https://github.com/mranney/node_redis/issues/74

Tôi không chắc chắn về kiến ​​trúc cơ bản cho kết nối-redis, nhưng tôi đang tự hỏi nếu gọi client.end là những gì đặt lại phiên của bạn. Điều gì sẽ xảy ra nếu bạn lấy chúng ra?

+0

Cảm ơn, tôi không biết điều đó. Tôi nghĩ nó sẽ sạch hơn. Nó không giải quyết được vấn đề mặc dù, nhưng tôi đang +1 bạn :) –

0

Chắc chắn bạn cần phải lưu phiên đó theo một cách nào đó, điều này có thể hiệu quả.

req.session.regenerate(function(){ 
    req.session.username = username.toString(); 
    res.redirect('/home'); 
}); 
+0

Điều này không thay đổi bất cứ điều gì, không may. Nhân tiện, điểm của chức năng tái tạo này là gì? –

+0

Nếu bạn định sửa đổi dữ liệu được lưu trữ trong một cơ sở dữ liệu liên tục, nó chỉ hợp lý là bạn sẽ cần * lưu * nó trước khi bạn có thể sử dụng nó trong các phần khác của hệ thống. Tôi ngạc nhiên rằng biến req.session.username vẫn tồn tại * mà không * lưu bất cứ điều gì ... có thể nó được thực hiện tự động như một tính năng –

2

Bạn đã thử với các trình duyệt khác không? Bạn có giữ cùng một id phiên giữa chuyển hướng trang không?

Bạn có thể thêm req.session.cookie.expires = false; trước khi chuyển hướng ...

1

Tôi đã có một vấn đề tương tự ở chỗ tôi đã thiết lập một cái gì đó trên phiên mà không được sự bền bỉ bên ngoài app.get() nó đã được thiết lập trong.

Vấn đề của tôi hóa ra là rằng tôi đã không làm một res.redirect() ở cuối số app.get() của tôi. Có vẻ như tôi đang thiết lập thứ gì đó trên một đối tượng yêu cầu và sau đó cho phép nó thu gom rác.

Tôi đã thêm một res.redirect('/nextmethod') và dữ liệu vẫn còn tốt.

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