event-source-polyfill库中怎样监听其他变乱
服务端在利用 EventSource 推送自定义变乱范例时,主要通过响应体来指定变乱范例,而不是在 HTTP 头字段中。
详细实现步调如下:
- 设置内容范例:首先,服务端要返回 Content-Type: text/event-stream,表明这是一个变乱流。
- 构造响应体:在响应体中,利用 event: 字段来指定变乱范例。客户端可以用这个变乱范例通过 addEventListener 监听。
详细格式
服务端发送的每一条消息都按如下格式构造:
- event: <event-name>
- data: <event-data>
复制代码 此中:
- event: 后面的内容是变乱范例,比如 update,假如不指定这个字段,默认变乱范例就是 message。
- data: 是变乱的详细内容,可以是 JSON、文本等。
代码示例(Node.js + Express)
以下是一个简单的示例,展示怎样在服务端设置自定义变乱范例:
- const express = require('express');
- const app = express();
- app.get('/events', (req, res) => {
- res.setHeader('Content-Type', 'text/event-stream');
- res.setHeader('Cache-Control', 'no-cache');
- res.setHeader('Connection', 'keep-alive');
- res.status(200);
- res.flushHeaders();// 及时发送刷新响应头
- // 定时发送自定义update事件
- setInterval(() => {
- res.write('event: update\n');
- res.write('data: {"message": "This is an update event"}\n\n');
- }, 3000);
- // 发送默认 message 事件
- setInterval(() => {
- res.write('event: message\n');//默认事件类型,可不写
- res.write('data: {"message": "This is a message event"}\n\n');
- }, 5000);
- });
- app.listen(3000, () => {
- console.log('Server is running on http://localhost:3000');
- });
复制代码 客户端监听
对于上述服务端代码,客户端可以像如许监听 update 和默认的 message 变乱:
原生写法:
- const eventSource = new EventSource('http://localhost:3000/events');
- // 监听 'update' 事件
- eventSource.addEventListener('update', (event) => {
- console.log('Update event:', event.data);
- });
- // 监听默认的 'message' 事件
- eventSource.onmessage = (event) => {
- console.log('Message event:', event.data);
- };
复制代码 event-source-polyfill库写法:
- import { EventSourcePolyfill } from 'event-source-polyfill';
- const eventSource = new EventSourcePolyfill('http://localhost:3000/events');
- eventSource.onopen = (event) =>{
- console.log("连接成功", event);
- };
- // 监听自定义事件 'update'
- eventSource.addEventListener('update', (event) => {
- console.log('Update event:', event.data);
- });
- // 监听默认的 'message' 事件
- eventSource.onmessage = (event) => {
- console.log('Message event:', event.data);
- };
- // 监听错误事件
- eventSource.onerror = (error) => {
- console.error('EventSource encountered an error:', error);
- };
复制代码 利用 EventSourcePolyfill 时,其 API 和标准EventSource完全兼容。
注意
- 变乱流结构:每个变乱之间要用两个换行符 \n\n 隔开,表示变乱结束。
- 保持连接:EventSource 是长连接,服务端需制止连接超时,大概需要定期发送心跳包。
定期发送心跳包
EventSourcePolyfill 支持自定义重连时间隔断,可以通过 heartbeatTimeout 设置选项来设置。
利用示例
以下示例展示了怎样利用 EventSourcePolyfill 的 heartbeatTimeout 参数来设置重连隔断:
- import { EventSourcePolyfill } from 'event-source-polyfill';
- // 设置重连时间间隔(单位为毫秒)
- const eventSource = new EventSourcePolyfill('http://localhost:3000/events', {
- heartbeatTimeout: 10000 ,// 10秒
- headers: {
- Authorization:token?token:"Bearer niuniu",
- }
- });
- // 监听事件
- eventSource.onmessage = (event) => {
- console.log('Message event:', event.data);
- };
复制代码 参数表明
- heartbeatTimeout:表示连接失活前等候的最大时间隔断(单位是毫秒)。假如在该时间内没有收到服务端的数据,EventSourcePolyfill 会实行重新连接。这在服务器没有主动发送心跳数据的情况下尤其有效。
服务端的心跳设置
通常,为了保持连接状态,服务端也可以每隔一段时间发送一个空的数据包作为心跳,比方:
- // 服务端心跳实现示例
- setInterval(() => {
- res.write(':\n\n'); // ":" 是注释行,不会被客户端处理,但保持连接活跃
- }, 10000); // 10秒
复制代码 如允许以淘汰客户端的自动重连频率,优化网络资源。
什么是res.flushHeaders()
res.flushHeaders() 是 Express(基于 Node.js 的 HTTP 响应对象)的一个方法,作用是在不发送响应主体的情况下立即将响应头发送给客户端。这在处置惩罚流式响应(如 Server-Sent Events 或文件流下载)时特别有效。
用法和作用
通常,Express 在发送响应主体之前会自动发送响应头,但偶尔我们希望在发送内容之前就发送响应头信息。res.flushHeaders() 就是为这种情况设计的:
- 立即发送头信息:将当前已设定的响应头立即发送到客户端,确保客户端在收到内容之前就能得到头信息。
- 保持连接活跃:在 SSE(服务器推送变乱)或及时数据传输的场景中,发送响应头后保持连接,可以在不关闭连接的情况下持续传输数据。
利用示例
在实现 SSE 时,通常会用到 res.flushHeaders() 以保证头信息在内容流发送之前发送:
- app.get('/events', (req, res) => {
- // 设置响应头
- res.setHeader('Content-Type', 'text/event-stream');
- res.setHeader('Cache-Control', 'no-cache');
- res.setHeader('Connection', 'keep-alive');
- // 强制立即发送响应头
- res.flushHeaders();
- // 发送数据流
- setInterval(() => {
- res.write(`data: ${JSON.stringify({ message: "Hello, SSE!" })}\n\n`);
- }, 3000);
- });
复制代码 注意事项
- 兼容性:res.flushHeaders() 仅在支持 flushHeaders 的 Node.js 版本中可用(Node.js v8.13+)。
- 流式响应:该方法适用于长连接或流式内容传输的场景,不适适用于短连接请求。
典型应用场景
- SSE(Server-Sent Events):立即发送头信息保持连接,然后持续推送数据。
- 文件下载:在文件分块下载时预先发送响应头,后续分块传输数据。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |