Nhờ giải thích về `express-session` và `connect-flash` trong Express
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-flash
và express-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 !
2 ANSWERS
Đầu tiên bạn cần hiểu flash
và session
.
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ưuid
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áiid
đã đượ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ínhlocation
để chỉ ra rằng trình duyệt phải chuyển hướng đếnuri
là giá trị củalocation
. Đế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-flash
và express-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.
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ứ.
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ậpreq.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???
m cảm thấy đã hiểu hơn rồi, cám ơn bạn rất nhiều : ))
@thanh_tuan You are welcome, bro
Nhờ các bạn giúp đơ mình ạ !
Cái
connect-flash
thì đúng là để hỗ trợ mở ra một cái flash mesage ở góc đó. Còn cáiexpress-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ưupage_views
vào session bằng package express-session này bạn xem thử xem https://www.tutorialspoint.com/expressjs/expressjs_sessions.htm@xdangminhtruongx tks bạn nha