Yêu cầu thg 5 25, 2019 3:38 SA 2964 1 2
  • 2964 1 2
+2

Nhờ giải thích về `express-session` và `connect-flash` trong Express

Chia sẻ
  • 2964 1 2

Chào mọi người, mình đang học Express và có tham khảo một demo về authentication sử dụng Passport ở trên Youtube.

Cái thư viện Passport thì mình có hiểu ý nghĩa của nó là một middleware giúp cho bạn khả năng tùy biến cao với rất nhiều các kịch bản authentication: có thể sử dụng Twitter, Facebook, Google thậm chí là qua username-password trong database.

Tuy nhiên mình không hiểu trong lúc làm phải cài thêm hai gói nưa là : connect-flashexpress-session. Mình chưa hiểu hai thằng này nhằm phục vụ cho mục đích gì.

Thằng connect-flash mình có search Google thì lắm sơ sơ được nó dùng để bắn ra một message để thông báo cho người dùng biết trạng thái sau khi họ đăng ký là thành công hay thất bại. Nhưng mình nghĩ là cái này có thể xử lý bằng tay cung được chứ làm gì đến mức phức tạp mà phải dùng đến thư viện đâu. Còn thằng express-session thì thực là mình chưa hiểu dùng nó để làm gì.

Mình có tìm hiểu trên Google rồi nhưng hầu hết các tài liệu chủ yếu là tiếng anh nên mình ko hiểu được nhiều. Rất mong các bạn giúp đỡ mình !

Avatar Anh Tran @thanh_tuan
thg 5 25, 2019 8:53 SA

Nhờ các bạn giúp đơ mình ạ !

Avatar Truong Dang @xdangminhtruongx
thg 5 27, 2019 1:23 SA

Cái connect-flash thì đúng là để hỗ trợ mở ra một cái flash mesage ở góc đó. Còn cái express-session để thao tác với session, như lưu lại thông tin phiên đăng nhập của người dùng, hoặc một số thông tin khác... Trong đây có đoạn code ví dụ về việc lưu page_views vào session bằng package express-session này bạn xem thử xem https://www.tutorialspoint.com/expressjs/expressjs_sessions.htm

Avatar Anh Tran @thanh_tuan
thg 6 1, 2019 8:59 SA

@xdangminhtruongx tks bạn nha

2 CÂU TRẢ LỜI


Đã trả lời thg 5 27, 2019 2:26 SA
+9

Đầu tiên bạn cần hiểu flashsession.

  • session được dùng để lưu dữ liệu của phiên đăng nhập. Dữ liệu này sẽ được lưu trữ mãi mãi trong một phiên và có thể được sử dụng trong tất cả các request. Ví dụ khi người dùng đăng nhập thành công thì bạn lưu id của người dùng đó và session. Tất cả các request người dùng này gửi về sau mình đều lấy được cái id đã được lưu ở trong session ra. Từ id lấy ra được user đã đăng nhập. Đối với mỗi người dùng thì session sẽ được lưu độc lập với nhau. Tức là giả sử người A đã đăng nhập, người B chưa đăng nhập. Thì request của người A gửi đến sẽ có id và request người B gửi sẽ không có id, kiểu như vậy. Ngoài việc lưu dữ liệu đăng nhập của người dùng ra thì bạn có thể lưu bất kỳ thứ gì cũng được. Ví dụ như giỏ hàng chẳng hạn. Đối với hệ thống mua hàng không nhất thiết yêu cầu người dùng đăng nhập thì mình có thể lưu thông tin giỏ hàng cho mỗi phiên tại session. Vì người dùng không đăng nhập thì mình sẽ không có thông tin user, mình không thể lấy thông tin gì để liên kết với thông tin giỏ hàng trong database được (nếu bạn có ý định lưu giỏ hàng trong database). Dùng session là phương pháp đơn giản và hiệu quả nhất trong trường hợp này.
  • flash là một khu vực đặc biệt trong session (dữ liệu của nó được lưu vào session) dùng để lưu trữ tin nhắn thông báo đến người dùng khi thực hiện thao tác nào đó. Vì nó là tin nhắn nên nó chỉ lưu và trả về response 1 lần rồi bị xóa đi. Các request sau sẽ không còn nữa. Vì sao dữ liệu này phải lưu vào session mà không phải là một biến để gửi ra view? Giả sử khi bạn tạo một sản phẩm. Sau khi tạo sản phẩm xong thì sẽ redirect đến trang danh sách sản phẩm với tin nhắn là "Tạo sản phẩm thành công". Redirect là do trình duyệt redirect chứ không phải server redirect. Server sẽ trả về một response với nôi dung header có thuộc tính location để chỉ ra rằng trình duyệt phải chuyển hướng đến uri là giá trị của location. Đến lúc này có nghĩa là server đã trả về dữ liệu của request tạo sản phẩm. Trình duyệt sẽ gửi một yêu cầu khác đến trang danh sách sản phẩm. Đây là một request mới, làm sao server biết được người dùng đã tạo thành công sản phẩm để nhúng cái message vào nội dung trả về của trang danh sách. Lúc này phải dùng một dữ liệu lưu chung cho toàn bộ phiên đăng nhập là session. Từ đó khi vào trang danh sách sản phẩm server sẽ lấy được message đã được lưu trong quá trình xử lý request tạo sản phẩm để hiện ra. Đồng thời nó sẽ xóa đi vì không cần dùng nữa. Lần sau truy cập vào trang danh sách này thì sẽ không thấy message nữa.

Việc sử dụng connect-flashexpress-session dùng để thao tác với 2 loại dữ liệu đó trên server. Bạn có thể sử dụng thư viện khác. Mình chắc là sẽ có thư viện khác 😃 . Hoặc nếu thích thì bạn có thể tự viết cho mình một cái thư viện để thao tác cho nó giống với phong cách của bạn hoặc để học tập hay gì đó. Nhưng khi đã có thư viện và nhiều người tin dùng nó thì cứ sử dụng cho chắc cú. Mình tự tạo thì sẽ gặp lỗi này lỗi kia rất mệt để có thể fix được.

Chia sẻ
Avatar Anh Tran @thanh_tuan
thg 6 1, 2019 9:11 SA

Cám ơn bạn nha. Có chô này mình chưa hiểu bạn giải thích thêm giúp mình:

Đối với hệ thống mua hàng không nhất thiết yêu cầu người dùng đăng nhập thì mình có thể lưu thông tin giỏ hàng cho mỗi phiên tại session. 
Vì người dùng không đăng nhập thì mình sẽ không có thông tin user, mình không thể lấy thông tin gì để liên kết với thông tin giỏ hàng trong database được (nếu bạn có ý định lưu giỏ hàng trong database). Dùng session là phương pháp đơn giản và hiệu quả nhất trong trường hợp này.

Mình tưởng khái niệm session luôn đi liền với login chứ. Người dùng có login thành công thì session mới được sinh ra chứ.

Đã trả lời thg 5 28, 2019 5:34 SA
+5

Chắc hẳn bạn cũng đã biết Session là khái niệm cơ bản khi bắt đầu bước chân vào lập trình web mà bất cứ lập trình viên web nào đều nắm được.

  • Khi có một request tới server, server tiếp nhận request thì lúc này một phiên làm việc giữa server và client được bắt đầu. Trong một phiên làm việc, server sẽ cần lưu trữ một số thông tin để thuận tiện xử lý trong các request tiếp theo của client. VD như thông tin định danh sau khi đăng nhập (vì chỉ đăng nhập một lần chứ ai mỗi lần request lại phải đăng nhập lại).
  • Session là thành phần trên server phản ánh một phiên làm việc. Session có Session Store để cho phép lưu trữ dữ liệu trong một phiên. Tất nhiên, cái store này sẽ ở trên server và hiển nhiên dữ liệu được lưu trên server. Tùy thuộc bạn implement cái Store như nào mà dữ liệu sẽ được lưu vào RAM, lưu trực tiếp ra file hoặc lưu vào database hay Redis. Hầu hết newbie mới tìm hiểu về session sẽ thắc mắc rằng session lưu trên server vậy làm sao server biết session nào thuộc client nào. Thực ra, mỗi session được định danh bằng một ID, ID này được response lại client và lưu vào Cookie để sử dụng trong các lần request tiếp theo. (Cookie được lưu ở trình duyệt của client).
  • Cái package express-session nó implement việc tạo ra thành phần session trong express. Cho phép bạn thực hiện thao tác lưu trữ dữ liệu vào session linh hoạt qua truy cập req.session**. Nếu bạn chỉ cài mỗi express-session thì cái Session Store mặc định đang lưu vào RAM của server nhé!
  • Đôi khi, dữ liệu bạn muốn lưu vào session và chỉ để dùng một lần duy nhất. VD: Bạn đang xử lý một request, trong khi xử lý request thì có lỗi phát sinh, bạn cần redirect tới một trang khác rồi hiển thị lỗi. Dữ liệu về lỗi bạn có thể lưu vào session để dùng một lần. Những dữ liệu được vào session để sử dụng như vậy người ta hay gọi là Flash Session (Flash ám chỉ nó chỉ tồn tại và biến mất trong một cái nháy mắt). Cái package thứ hai bạn đang dùng connect-flash nó implement cách xử lý Flash Session. Bạn chỉ cần lưu, các việc xóa phía sau package đấy đã xử lý.
  • Còn vấn đề tại sao lưu Flash Session đơn giản vì người ta không muốn cho client nhìn thấy được dữ liệu. Chẳng hạn như việc redirect, sẽ ra sao khi bạn lưu vào query string trên URL??? 😄
Chia sẻ
Avatar Anh Tran @thanh_tuan
thg 6 1, 2019 9:19 SA

m cảm thấy đã hiểu hơn rồi, cám ơn bạn rất nhiều : ))

thg 6 1, 2019 12:08 CH

@thanh_tuan You are welcome, bro 👋

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí