2013-04-08 30 views
17

Tôi có ứng dụng Express với một số tuyến đường, chỉ hai trong số đó cần hỗ trợ phiên. Tôi đọc ở khắp mọi nơi rằng định nghĩa middleware (app.use (express.session ({...) chỉ áp dụng cho các tuyến đường mà đến sau khi nó, vì vậy tôi tạo ra mẫu này:NodeJS + Express - Áp dụng phần mềm trung gian phiên cho một số tuyến đường

var express = require('express'); 
var app = express(); 
app.use(express.bodyParser()); 

app.get('/path1', function (req, res) { 
    res.send('text response'); 
}); 


app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: 'secret', 
    cookie: { maxAge: new Date(Date.now() + 2 * 60 * 1000) } 
})); 


app.get('/path2', function (req, res) { 
    res.session.test = { "test": "test" }; 
    res.send('text response'); 
}); 

app.listen(8088); 

Nhưng điều này không
Nếu tôi di chuyển định nghĩa phần mềm trung gian phiên lên - mọi thứ hoạt động, nhưng tôi thấy các phiên đang được tạo khi gọi/đường dẫn1 (đây là những gì tôi muốn tránh)

Ai đó có thể giải thích cách ứng dụng đơn có thể sử dụng phiên chỉ trong một số tuyến đường.

Cảm ơn!

///// CẬP NHẬT //////

Sau khi đào sâu thêm - I figured it out:

Không sử dụng: app.use(express.session({ ... }));
Thay vào đó - xác định như sau:

var sessionMiddleware = express.session({ 
    //session configurations 
}); 

function sessionHandler(req, res, next) { sessionMiddleware(req, res, next); } 

Sau đó, áp dụng xử lý trên các tuyến đường cụ thể/s mà cần sự hỗ trợ phiên:

app.get('/path_that_need_session', sessionHandler, function (req, res) {      
/* Do somthing with req.session */ 
}); 
+1

Để làm cho câu trả lời của bạn rõ ràng hơn, tại sao không viết câu trả lời và chấp nhận câu trả lời (OK). Điều này làm việc thực sự tốt cho tôi để cô lập phiên cho các tuyến đường nhất định. Cảm ơn. –

Trả lời

22

Không sử dụng app.use(express.session({ ... })).

Thay vào đó, hãy khởi tạo phần mềm trung gian phiên, lưu tham chiếu đến hàm kết quả, sau đó bao gồm nó trực tiếp trong các tuyến bạn muốn.

var express = require('express'), 
    app = express(); 

var session = express.session({ 
    //session configuration 
}); 

app.use(app.router); 


// must come after app.use(app.router); 
app.get('/your/route/here', session, function(req, res){ 
    // code for route handler goes here 
}); 

Hơi đơn giản hơn câu trả lời có trong bản cập nhật (bạn không cần chức năng trình bao bọc).

+0

Cảm ơn! Đó chính xác là những gì tôi đã làm. – alonkad

0

Sự cố thực sự là tuyến đường của bạn cho /path1, được xác định trước khi sử dụngexpress.session.

Khi bạn khai báo trình xử lý tuyến đường trong Express, tại thời điểm đó, phần mềm trung gian router (xử lý tất cả tuyến đường) sẽ được chèn vào chuỗi phần mềm trung gian. Điều đó có nghĩa là nếu bạn chưa có app.use 'bất kỳ phần mềm trung gian nào sẽ được sử dụng bởi các tuyến đường tương lai (như trình xử lý của bạn cho /path2), chúng sẽ không bao giờ được gọi khi xử lý bất kỳ tuyến đường nào.

Nếu bạn di chuyển trình xử lý của mình cho /path1 đến sau app.use(express.session(...)), nó sẽ hoạt động mà không cần phải sử dụng các thủ thuật.

+0

Nếu tôi di chuyển tuyến đường/path1 đến sau 'app.use (express.session (...))' - nó sẽ sử dụng các phiên (đó là những gì tôi muốn tránh). – alonkad

+0

Tôi chỉ muốn/path2 sử dụng phiên (nó chỉ được sử dụng để xác thực lần đầu)./path1 được sử dụng rộng rãi hơn và không cần phiên - vì vậy tôi muốn lưu các phiên trên cao (tôi lưu chúng trong một DB) – alonkad

+0

Đủ công bằng.Tôi nghĩ bạn thực sự có thể bỏ qua hàm 'sessionHandler' trong trường hợp của bạn, bởi vì tất cả điều đó là ủy nhiệm các đối số cho' sessionMiddleware' (vì vậy bạn cũng có thể sử dụng trực tiếp). – robertklep

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