2013-03-08 9 views
13

Tôi đang cố gắng hiểu khi nào tốt nhất nên sử dụng từng phần sau. Đây là sự hiểu biết sơ bộ của tôi:Express.js: app.locals vs req.locals vs req.session

app.locals - tốt để lưu trữ biến toàn cầu ở cấp ứng dụng. tất cả người dùng/phiên sẽ thấy cùng giá trị cho các biến này. các biến có sẵn cho tất cả các chế độ xem.

res.locals - tốt để lưu trữ biến cho chu kỳ yêu cầu/phản hồi cụ thể. các biến chỉ có sẵn cho chế độ xem được liên kết với phản hồi.

req.session - tốt để lưu trữ các biến được liên kết với phiên người dùng duy nhất (ví dụ: tên người dùng). các biến này sẽ có sẵn cho tất cả các chế độ xem cho người dùng/phiên duy nhất.

Trường hợp sử dụng cụ thể mà tôi có như sau: Người dùng chạy truy vấn truy xuất dữ liệu từ mongodb. Bây giờ tôi muốn kết quả của truy vấn này, là một mảng json, có sẵn như là một biến cho TẤT CẢ các khung nhìn (các yêu cầu http). Cách tốt nhất để "lưu trữ" mảng kết quả để mỗi chế độ xem có thể truy cập nó là gì?

Cảm ơn

+0

Bạn đã tự trả lời khá nhiều câu hỏi. req.locals dành cho dữ liệu sẽ có sẵn trong các chế độ xem cho yêu cầu hiện tại. –

+4

là 'res.locals', không phải' req.locals' – Daniel

Trả lời

4

bây giờ tôi muốn kết quả của truy vấn này, mà là một mảng json, sẵn như là một biến cho TẤT CẢ các quan điểm. cách tốt nhất để "lưu trữ" mảng kết quả để mỗi chế độ xem có thể truy cập nó là gì?

Khi bạn nói "có sẵn cho TẤT CẢ các chế độ xem", tôi giả sử bạn có nghĩa là trên tất cả các yêu cầu HTTP. Nếu đó là trường hợp thì bạn cần phải nhận thức được rằng HTTP là một giao thức không trạng thái và không cung cấp cho điều này. Bạn sẽ cần phải phát triển cơ chế của riêng bạn cho việc này.

Một cách để làm điều này là bằng cách đệm thông tin này (mảng) trên máy chủ và truy xuất nó trên mọi yêu cầu (ví dụ, truy xuất nó từ bộ nhớ thay vì từ MongoDB). Bạn sẽ lưu trữ một ID phiên trên cookie và dựa trên ID này tìm nạp nó từ bộ nhớ cache khi một yêu cầu khác đi qua. Có một số công cụ bộ nhớ cache có sẵn (ví dụ: redis, memcached, et cetera) mà bạn có thể chọn để lưu trữ thông tin trong bộ nhớ.

Bạn cũng có thể đặt thông tin này (bản thân mảng) trong trường hợp nó sẽ được gửi qua lại giữa máy khách và máy chủ trên mọi yêu cầu HTTP và rất có thể sẽ không là ý tưởng hay trừ khi dữ liệu rất nhỏ.

+1

Nếu bạn lưu trữ dữ liệu trong 'app.locals' và không chạy nhiều quá trình Node (nghĩa là bạn không sử dụng' cluster'), nó sẽ có sẵn cho tất cả các chế độ xem, ngay cả trên các yêu cầu. – robertklep

+0

@robertklep - đó là những gì tôi đã làm ban đầu, lưu trữ dữ liệu trong app.locals, nhưng sau đó tôi chạy thử nghiệm với hai máy tính tạo yêu cầu HTTP và cả hai đều thấy cùng một dữ liệu! Tôi không muốn chia sẻ dữ liệu giữa các khách hàng. –

+2

Vì vậy, bạn muốn chúng có sẵn trong tất cả các chế độ xem nhưng chỉ cho người dùng đã kích hoạt truy vấn? Sử dụng 'req.session' (một lần nữa, trong câu hỏi của bạn, bạn đã tự trả lời ;-) – robertklep