Thiết lập Socket.io

Hầu hết các ứng dụng web đều sử dụng HTTP. Quy trình tuân theo một mô hình đơn giản:

Client gửi một yêu cầu. Server gửi một phản hồi. Kết nối đóng lại.

Điều này hoạt động tốt cho việc xác thực hoặc lấy dữ liệu. Tuy nhiên, nó sẽ thất bại khi server cần gửi dữ liệu mà không có yêu cầu trước đó.

Nếu một đồng nghiệp cập nhật một tác vụ hoặc trạng thái thay đổi, HTTP sẽ khiến trình duyệt phải hỏi "Có dữ liệu mới không?" liên tục. Điều này được gọi là polling. Nó gây lãng phí tài nguyên.

Socket.io giải quyết vấn đề này. Nó tạo ra một kết nối bền vững. Kết nối này luôn duy trì trạng thái hoạt động.

Giao tiếp trở thành hai chiều: Client ↔ Server

Client gửi dữ liệu. Server gửi dữ liệu. Điều này cho phép xây dựng các ứng dụng thời gian thực.

Một sai lầm phổ biến là cố gắng gắn Socket.io trực tiếp vào Express. Express ẩn đi HTTP server bên dưới. Socket.io cần quyền truy cập trực tiếp vào server đó.

Thay vào đó, hãy làm như sau:

  1. Tạo server bằng ứng dụng Express của bạn.
  2. Gắn Socket.io vào server đó.
  3. Bắt đầu lắng nghe trên cổng (port).

Socket.io dựa trên hai phương thức:

• socket.emit(): Gửi một sự kiện. • socket.on(): Lắng nghe một sự kiện.

Các Rooms giúp Socket.io hoạt động hiệu quả. Hãy coi chúng như các kênh bộ đàm. Bạn có thể nhóm người dùng vào các phòng dự án cụ thể.

Khi một người dùng mở một dự án, họ sẽ tham gia vào một phòng. Khi có một bản cập nhật xảy ra, bạn chỉ phát (emit) sự kiện đó tới phòng cụ thể đó. Điều này giúp tránh việc gửi dữ liệu cho những người dùng không cần đến nó.

Việc triển khai đúng cách rất quan trọng. Đừng đặt logic nghiệp vụ bên trong Socket.io handler. Hãy đặt nó trong các route handler của bạn.

Quy trình đúng là:

  1. Người dùng gửi một yêu cầu đến một route.
  2. Server cập nhật cơ sở dữ liệu.
  3. Thao tác cơ sở dữ liệu thành công.
  4. Server phát (emit) sự kiện Socket.io.
  5. Các client cập nhật giao diện người dùng (UI) của họ.

Đừng bao giờ phát một sự kiện trước khi cơ sở dữ liệu xác nhận thay đổi.

Để giữ cho mã nguồn sạch sẽ, hãy lưu trữ instance của Socket.io trên ứng dụng Express. Sử dụng app.set("io", io). Điều này cho phép bất kỳ route nào cũng có thể truy cập instance mà không cần các lệnh import rắc rối.

Giao tiếp thời gian thực có nghĩa là người dùng thấy các cập nhật ngay lập tức mà không cần tải lại trang.

Nguồn: https://dev.to/chinwuba_jeffrey/setting-up-socketio-a42