什么是 SSE
SSE,全称为 Server-Sent Events,中文翻译为服务器推送事件,通常是指使用 HTTP 协议中的长连接,服务器不断地向客户端发送事件流,从而实现实时通信。
与传统的轮询方式相比,SSE 可以避免不必要的请求,并且实时性更好,适用于一些实时通信场景。
Node.js 实现 SSE
利用 Node.js 可以很容易地实现 SSE 服务。下面我们来实现一个该服务,用于推送豆瓣正在上映电影信息。
首先,需要引入 http
和 fs
模块,并创建一个服务器,代码如下所示:
const http = require('http'); const fs = require('fs'); const server = http.createServer((req, res) => { // 处理请求 });
然后,在处理请求时,判断是否为 SSE 请求:
if (req.headers.accept && req.headers.accept === 'text/event-stream') { // SSE 请求 }
若是 SSE 请求,则设置响应头:
res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', });
其中,Content-Type
设置为 text/event-stream
,表示返回内容为 SSE 格式;Cache-Control
设置为 no-cache
,表示不缓存数据;Connection
设置为 keep-alive
,保持持久连接,以便后续的事件都可以通过同一连接来发送。
接着,需要定时向客户端发送事件。这里实现一个循环,每隔一定时间就发送一次事件:
setInterval(() => { // 发送事件 }, 5000);
事件格式如下:
res.write('event: message\n'); res.write(`data: ${data}\n\n`);
其中,event
指定事件类型,data
是事件的数据。每个事件需要以两个换行符结尾。
最后,记得在服务器关闭时,关闭连接:
req.on('close', () => { // 关闭连接 });
推送豆瓣正在上映电影信息
对于推送正在上映电影信息的例子,可以用到豆瓣的 API,需要安装 request
模块:
npm install request
然后,获取正在上映的电影信息:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------------------------------------------- ------------ ------- --------- ----- -- - -- ------- -- ------------------- --- ---- - ----- ---- - ------------------------------------- -- - ------ - ------ ------------ ------- --------------------- ---- -------------------- -- --- -- ---- - ---
获取到电影信息后,可以将数据格式化成 SSE 的格式,然后推送给客户端。
最终,整体代码如下所示:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- -- - -------------- ----- ------- - ------------------- ----- ------ - ----------------------- ---- -- - -- ------------------- -- ------------------ --- -------------------- - ------------------ - --------------- -------------------- ---------------- ----------- ------------- ------------- --- -------------- -- - ------------------------------------------------------ ------- --------- ----- -- - -- ------- -- ------------------- --- ---- - ----- ---- - ------------------------------------- -- - ------ - ------ ------------ ------- --------------------- ---- -------------------- -- --- ----- --------- - ------- -------------- ----------------------------- --------------------- - --- -- ------ --------------- -- -- - ---------- --- - ---- - ------------------ - --------------- ----------- --- ----------------------------------- - -------------- --------- ---------- - --- -------------------- ------------------- -- ------- -- ---- -------
其中,index.html
文件用于测试 SSE 服务,它的代码如下:
-- -------------------- ---- ------- ------ ------ ---------- ------------ ------- ------ --- ----------------- -------- --- ------ - --- -------------------- ---------------- - --------------- - --- ------ - ----------------------- --- --------- - --- ------------------------------ - --------- -- ------ - ----------- - - - - - ------------ - -------- --- ------------------------------------------- - ---------- -- --------- ------- -------
客户端通过 SSE 接收到服务端推送的电影信息后,可以用 JavaScript 将数据渲染到页面上,从而实现实时更新。
总结
本文介绍了如何使用 Node.js 实现 SSE 服务器推送,以及应用实例:推送豆瓣正在上映电影信息。SSE 技术可以用于实现实时通信等场景,具有较高的实时性和性能优势,值得学习和应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647dac1f968c7c53b087aab7