如何在 Node.js 中使用 Server-Sent Events 进行前端更新

随着现代 web 技术的发展,客户端和服务器之间的实时通信变得越来越重要。传统上,web 应用程序通常使用轮询技术来定期向服务器发送请求以获取更新数据。这种方法通常会导致网络负载增加,并且不能实时更新数据。近年来,Server-Send Events (SSE) 成为了一种很好的解决方案,它可以实现在服务器端向客户端发送数据,实时通信、自动重连等特性使得它在 web 应用程序中得到广泛应用。

在本文中,我将向您介绍如何在 Node.js 中使用 SSE 进行实时通信,以及相关设计和技巧,您将会学会如何利用 SSE 的优势,在 web 应用程序中实现实时交互。

Server-Send Events(SSE)

Server-Send Events 是一种 HTML5 规范,用于实现服务器向客户端单向数据即时推送的功能。SSE 的核心优势在于服务器可以直接将数据发送给客户端,而不需要客户端发送请求来获取数据,这使得 SSE 成为实时通信的理想选择。

SSE 使用长轮询机制来实现数据传递,当客户端连接到服务器时,服务器会保持连接打开,直到有数据推送。当服务器有数据要推送时,它会将数据推送到客户端,并保持连接一段时间以确定客户端是否成功接收到数据。如果连接断开,则浏览器会尝试自动重连,直到连接成功或超出连接限制。

下面是一个简单的 SSE 实现例子:

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

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

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

在浏览器中访问该页面,你会看到时间每秒钟更新一次。在服务端代码中,我们通过 http.createServer 来创建了一个 HTTP 服务器,然后我们为响应设置了 Content-Typetext/event-stream,这是 SSE 的标准 MIME 类型。然后我们设置了允许跨域的 Access-Control-Allow-Origin,并禁用了缓存 Cache-Control: no-cache

在我们的服务器中,我们开启了一个定时器,在每秒钟的间隔中,向客户端发送一个包含当前时间的数据块,数据块的格式如下:

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

其中,data 是我们要发送的数据。请注意,每个 SSE 数据块后面需要有两个换行符表示块结束。

在客户端代码中,我们可以通过创建一个事件源对象来接收 SSE 数据:

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

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

在上面的代码中,我们创建了一个名为 eventSource 的事件源对象,并将其连接到我们的 SSE 服务器。然后,当我们收到新的消息时,我们将其打印到控制台中。

集成 SSE 到前端应用

现在我们已经了解了 SSE 是什么,如何在服务端和客户端实现 SSE 流。接下来我们将使用 Node.js 和 SSE,来构建一个实时任务追踪应用程序。

1. 初始化项目

首先,我们需要初始化一个空的 Node.js 项目。我们可以通过运行以下命令来创建一个新的 Node.js 项目:

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

2. 安装依赖

接下来,我们需要安装一些依赖。我们将使用 Express.js 框架来搭建我们的 web 服务器,并使用 MongoDB 来存储任务数据。

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

3. 创建服务器

接下来,我们将创建我们的 Express.js 服务器,并实现 SSE 服务器。我们将使用 MongoDB 存储我们的任务数据,并通过 SSE 将它们推送到客户端。

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

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

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

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

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

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

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

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

在上面的代码中,我们启动了一个 Express.js 应用,并在 /tasks-events 路由中添加了 SSE 服务器。我们使用 MongoDB 存储任务数据,并在每秒钟的时间间隔中从数据集合中获取所有任务数据,并将其转换为 JSON 后,将其发送到客户端。

4. 创建客户端

最后,我们需要在客户端中订阅 SSE 数据并将其显示在页面上。

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

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

在上面的代码中,我们添加了一个订阅 SSE 事件的客户端 JavaScript 代码。在我们收到新的 SSE 消息时,我们使用接收到的 JSON 数据更新我们的任务列表。最终效果见下图:

总结

Server-Send Events(SSE)是一种实现服务器向客户端单向数据即时推送的功能,它的核心优势在于服务器可以直接将数据发送给客户端,而不需要客户端发送请求来获取数据,这使得 SSE 成为实时通信的理想选择之一。

在本文中,我们通过一个实时任务追踪应用程序使用 SSE 在 Node.js 中进行了实现。您已经了解了如何在服务器端和客户端实现 SSE 架构,如何使用 SSE 数据进行交互,以及如何使用 SSE 架构构建实时应用程序。我希望您现在能够独立地使用 SSE 架构并将其集成到您的自己的web应用程序中,使得它们可以实现实时通信和无缝更新。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65434e377d4982a6ebcfb977


猜你喜欢

  • ECMAScript 2021:精通 JavaScript 的类型数组

    在 JavaScript 的世界中,类型数组是一种非常强大且有用的工具。它可以用来处理二进制数据,如图像数据、音频数据、网络数据等。在 ECMAScript 2021 中,类型数组得到了重大改进,在性...

    1 年前
  • 手把手教你使用 Webpack 搭建 React 项目

    在前端开发中,使用打包工具可以方便地管理项目中的各种模块和依赖,提高开发效率。而 Webpack 是目前前端领域最流行的打包工具之一。本文将介绍如何使用 Webpack 搭建 React 项目。

    1 年前
  • 在 ES6 中使用 let 和 const

    在 ES6 中使用 let 和 const ES6 是 JavaScript 中值得重点关注的版本之一,因为它引入了许多新特性,其中包括 let 和 const 这两个关键字。

    1 年前
  • Vue.js 实现音频录制及播放的技巧

    随着互联网技术的不断更新,音频录制及播放逐渐成为了不可或缺的功能,尤其在一些音乐、语音社交应用中,更是发挥了极其重要的作用。那么,在开发过程中,如何使用 Vue.js 实现音频录制及播放的功能呢?本文...

    1 年前
  • 如何使用 Deno 实现 JWT 认证以及用户权限控制?

    在开发 Web 应用程序时,身份验证和授权是不可避免的一部分。JSON Web Token(JWT)是一种广泛使用的身份验证协议,它提供了方便的方式来验证客户端的身份,并为用户授予相应的权限。

    1 年前
  • Mongoose 的锁机制及应用实例

    在 Node.js 中,Mongoose 是最流行的 MongoDB ODM(对象文档映射器),它可以让 Node.js 开发者更方便地使用 MongoDB 数据库。

    1 年前
  • Hapi 服务器优化实践:使用 Good 插件监测服务器健康状况

    Hapi 是 Node.js 服务器框架中很受欢迎的一个,它提供了很多高级功能,比如路由管理、处理请求和响应等。虽然 Hapi 在很多方面的表现很好,但在服务器性能优化中,我们还需要一些其他的工具和技...

    1 年前
  • 解决 Material Design 中 TabLayout 切换后 Fragment 重影的问题

    解决 Material Design 中 TabLayout 切换后 Fragment 重影的问题 在使用 Material Design TabLayout 时,我们可能会遇到一个问题,就是在 Ta...

    1 年前
  • Cypress 测试框架中的自定义指令

    简介 Cypress是一个现代化的前端端对端(E2E)测试工具,它通过模拟用户交互来测试web应用程序。Cypress中的测试用例以及断言等功能十分强大,可以快速准确地测试应用程序是否按照预期工作。

    1 年前
  • LESS 中使用棕色怎么写?

    什么是 LESS? LESS 是一种动态样式语言,它扩展了 CSS 语言,使其具有程序化的特性。通过 LESS,你可以使用变量、函数、操作符等来编写 CSS 样式,使其更加灵活、易于维护。

    1 年前
  • 在 Chai 测试中使用 E2E 测试

    E2E(End-to-End)测试是指在真实的生产环境中对应用程序进行测试的一种方法。在前端开发中,我们可以使用 E2E 测试来测试用户界面、交互和数据流等方面。这种测试方法可以帮助我们发现并且解决应...

    1 年前
  • ES10 中新的全局对象方法 String.matchAll()

    在 ES10 中,引入了新的全局对象方法 String.matchAll(),该方法能够更方便地进行字符串匹配操作。本文将为大家详细介绍 String.matchAll() 方法的使用方法和指导意义。

    1 年前
  • Socket.io 实现实时天气预报的方法

    在前端开发中,实现实时更新和交互性的功能是十分关键的。Socket.io 是一个基于 Node.js 的实时应用程序框架,可以帮助我们轻松地实现实时的交互功能。本文将介绍如何使用 Socket.io ...

    1 年前
  • 谈谈 ES7 中的 generator 函数

    什么是 Generator 函数? Generator 函数是 ES6 中引入的一种新的函数类型,通过特定的语法可以在函数执行过程中暂停并继续执行。相比于普通函数,Generator 函数具有以下几个...

    1 年前
  • PWA 实战:如何在 Vue 项目中快速搭建 PWA 应用?

    随着移动端应用的日益普及,PWA(Progressive Web Apps) 作为一种新型的移动端应用模式,也逐渐走进了前端开发人员的视野。PWA 的核心思想是将移动端原生应用的部分体验带到 Web ...

    1 年前
  • PM2 如何管理不同的 Node.js 环境

    随着前端技术的不断发展,Node.js 的应用越来越广泛。在开发过程中,我们可能需要管理多个 Node.js 应用,这时就需要一个好用的管理工具。其中,PM2 是一个比较流行的管理工具,本文将详细介绍...

    1 年前
  • 基于 Serverless 的大规模数据迁移实践

    在互联网时代,数据是企业重要的资产之一,因此数据的迁移是一个非常重要的技术工作。数据迁移需要考虑多种因素,如存储、带宽、安全性、稳定性等。而 Serverless 技术则是一种可以大幅度减少迁移成本的...

    1 年前
  • Headless CMS 和现代 Web 开发的生态系统

    现代 Web 开发的生态系统在不断扩大,Headless CMS 是其中的一个重要组成部分。Headless CMS 允许前端开发者通过 API 访问内容,将内容管理和展示分离开来,从而提升开发效率和...

    1 年前
  • ECMAScript 2021:函数柯里化(Currying)详解

    ECMAScript 2021:函数柯里化(Currying)详解 函数柯里化(Currying)是一种 JavaScript 函数式编程技术,它使得函数能够接收多个参数而被简单化。

    1 年前
  • 在 Deno 中如何进行 Web 爬虫开发?

    Web 爬虫是一种抓取互联网信息的工具,它可以自动化地访问网站并提取所需数据。在 Deno 平台上,我们可以使用一些现成的库来开发 Web 爬虫,也可以自己编写代码实现。

    1 年前

相关推荐

    暂无文章