使用 Server-Sent Events 实现即时新闻通知

阅读时长 5 分钟读完

Server-Sent Events(简称 SSE)是一种实现服务器向客户端推送数据的技术。与传统的 AJAX 轮询相比,SSE 更加高效、实时,并且可以减少服务器和客户端之间的通信量。在前端开发中,SSE 可以用于实现即时通知、聊天室、实时数据展示等功能。

本文将介绍如何使用 SSE 实现一个即时新闻通知应用。我们将使用 Node.js 和 Express 框架搭建服务器,前端将使用 HTML5 和 JavaScript。本文假设读者已经具备一定的 Node.js 和前端开发基础。

服务器端实现

首先,我们需要在服务器端实现 SSE。Express 框架提供了一个中间件 res.sse(),可以用于发送 SSE 数据。我们可以在路由中使用该中间件,如下所示:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

---------------- ----- ---- -- -
  ---------
    --------------- --------------------
    ---------------- -----------
    ------------- ------------
  ---
  ---------------
  -------------- -- -
    --------------- -----------------------------
  -- ------
---
展开代码

在上面的代码中,我们创建了一个 /news 路由,当客户端访问该路由时,服务器会每隔 1 秒钟发送一条带有当前时间的 SSE 消息。

其中,res.set() 用于设置响应头,Content-Type 设置为 text/event-stream 表示该响应是 SSE 数据,Cache-Control 设置为 no-cache 表示不缓存数据,Connection 设置为 keep-alive 表示保持连接。

res.sseSetup() 用于设置 SSE 的响应头,包括 Content-TypeCache-ControlConnectionres.sseSend() 用于发送 SSE 消息,可以传递一个字符串或一个对象,例如:

在上面的代码中,我们通过 event 字段指定了 SSE 事件的名称,通过 data 字段指定了 SSE 数据的内容。

客户端实现

接下来,我们需要在客户端实现 SSE 的接收和处理。在 HTML5 中,我们可以使用 EventSource 对象来接收 SSE 数据。代码如下:

在上面的代码中,我们创建了一个 EventSource 对象,指定了 SSE 数据的来源为 /news 路由。然后,我们通过 addEventListener 方法监听了 news 事件,当服务器端发送 SSE 数据时,会触发该事件,我们可以在事件处理函数中获取数据并进行处理。

需要注意的是,SSE 数据是以文本流的形式传输的,因此我们需要将 JSON 字符串解析成 JavaScript 对象,才能进行处理。

示例代码

下面是一个完整的示例代码,包括服务器端和客户端的实现:

-- -------------------- ---- -------
-- ----
----- ------- - -------------------
----- --- - ----------

---------------- ----- ---- -- -
  ---------
    --------------- --------------------
    ---------------- -----------
    ------------- ------------
  ---
  ---------------
  -------------- -- -
    ----------------------------
      ------ -------
      ----- --------------------
    ----
  -- ------
---

-- ---
----- ------ - --- ---------------------
------------------------------- ------- -- -
  ----- ---- - -----------------------
  ------------------
---
展开代码

在上面的代码中,我们每隔 1 秒钟发送一条 SSE 消息,客户端接收到消息后打印出来。

指导意义

使用 SSE 实现即时新闻通知是一个简单而实用的应用场景。在实际开发中,我们可以根据需求自定义 SSE 事件和数据格式,实现更加复杂的功能,例如聊天室、实时数据展示等。

需要注意的是,SSE 只能从服务器向客户端推送数据,客户端无法向服务器发送数据。如果需要实现双向通信,可以考虑使用 WebSocket 等其他技术。

另外,由于 SSE 数据是以文本流的形式传输的,因此在处理大量数据时需要注意性能问题,避免造成服务器和客户端的负载过大。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d2af4ba941bf7134535c0e

纠错
反馈

纠错反馈