如何使用 Node.js 实现基于 Server-Sent Events 的消息推送

前言

在现代 Web 应用程序中,消息推送已经成为了一个必不可少的功能。随着 WebSocket 的出现,我们可以很方便地实现实时通信。但对于一些简单的场景来说,WebSocket 可能显得过于复杂。这时候,使用 SSE (Server-Sent Events) 可能是比较合适的选择。

SSE 是一种单向、持久连接的协议,它允许服务器不断向客户端发送消息。SSE 使用 HTTP 连接,因此可以在几乎所有现代浏览器上使用。本文将介绍如何使用 Node.js 实现 SSE,以实现服务器向客户端的实时消息推送。

实现 SSE

首先,我们需要创建一个 HTTP 服务器。在使用 SSE 时,我们需要设置响应头,以告知浏览器这是一个 SSE 连接。响应头中必须包括以下字段:

下面是一个简单的 SSE 服务器的实现:

上述代码中,我们设置了响应头,当客户端连接关闭时,我们关闭响应流。现在,我们已经可以创建一个 SSE 服务器了,但我们还需要向客户端发送消息。

向客户端发送消息

SSE 的协议规定,每个消息以 event: eventName 开头,以 data: eventData 结尾。消息可以包含多个事件,每个事件使用相同的格式。

下面是向客户端发送消息的代码:

上述代码中,我们在 setInterval 中,向客户端发送 testEvent 事件,并携带当前时间戳数据。eventdata 字段是 SSE 协议的规定字段,通过在每条消息中设置,我们就能向客户端传递数据了。

现在,我们已经成功地向客户端发送了 SSE 消息,但是客户端还没有能够获取到消息。

客户端处理 SSE 消息

在客户端,我们可以使用 JavaScript 的 EventSource 接口,监听 SSE 服务器的消息。

上述代码中,我们使用 EventSource 接口,连接 SSE 服务器,并监听 testEvent 事件。当服务器发送 testEvent 事件时,addEventListener 回调函数将被执行,并打印事件携带的数据。

总结

本文介绍了如何使用 Node.js 实现 SSE,以实现服务器向客户端的实时消息推送。要使用 SSE,我们需要创建一个 HTTP 服务器,并设置 SSE 协议规定的响应头。向客户端发送消息时,每条消息应该包含事件名称和携带的数据。客户端可以通过 EventSource 接口监听服务器的 SSE 消息。本文中,我们演示了 SSE 的基本用法,你可以根据实际需求,进一步扩展。

完整源码:https://github.com/wenguang81/Node.js-SSE-Demo

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6541e9157d4982a6ebb87b2f


纠错
反馈