ToB企服应用市场:ToB评测及商务社交产业平台

标题: 前端SSE包event-source-polyfill的其他变乱监听的实现 [打印本页]

作者: 李优秀    时间: 2025-1-7 20:19
标题: 前端SSE包event-source-polyfill的其他变乱监听的实现
event-source-polyfill库中怎样监听其他变乱

服务端在利用 EventSource 推送自定义变乱范例时,主要通过响应体来指定变乱范例,而不是在 HTTP 头字段中。
详细实现步调如下:
详细格式

服务端发送的每一条消息都按如下格式构造:
  1. event: <event-name>  
  2. data: <event-data>  
复制代码
此中:

代码示例(Node.js + Express)

以下是一个简单的示例,展示怎样在服务端设置自定义变乱范例:
  1. const express = require('express');
  2. const app = express();
  3. app.get('/events', (req, res) => {
  4.   res.setHeader('Content-Type', 'text/event-stream');
  5.   res.setHeader('Cache-Control', 'no-cache');
  6.   res.setHeader('Connection', 'keep-alive');
  7.   res.status(200);
  8.   res.flushHeaders();// 及时发送刷新响应头
  9.   // 定时发送自定义update事件
  10.   setInterval(() => {
  11.     res.write('event: update\n');
  12.     res.write('data: {"message": "This is an update event"}\n\n');
  13.   }, 3000);
  14.   // 发送默认 message 事件
  15.   setInterval(() => {
  16.            res.write('event: message\n');//默认事件类型,可不写
  17.     res.write('data: {"message": "This is a message event"}\n\n');
  18.   }, 5000);
  19. });
  20. app.listen(3000, () => {
  21.   console.log('Server is running on http://localhost:3000');
  22. });
复制代码
客户端监听

对于上述服务端代码,客户端可以像如许监听 update 和默认的 message 变乱:
原生写法:
  1. const eventSource = new EventSource('http://localhost:3000/events');
  2. // 监听 'update' 事件
  3. eventSource.addEventListener('update', (event) => {
  4.     console.log('Update event:', event.data);
  5. });
  6. // 监听默认的 'message' 事件
  7. eventSource.onmessage = (event) => {
  8.     console.log('Message event:', event.data);
  9. };
复制代码
event-source-polyfill库写法:
  1. import { EventSourcePolyfill } from 'event-source-polyfill';
  2. const eventSource = new EventSourcePolyfill('http://localhost:3000/events');
  3. eventSource.onopen = (event) =>{
  4.       console.log("连接成功", event);
  5. };
  6. // 监听自定义事件 'update'
  7. eventSource.addEventListener('update', (event) => {
  8.     console.log('Update event:', event.data);
  9. });
  10. // 监听默认的 'message' 事件
  11. eventSource.onmessage = (event) => {
  12.     console.log('Message event:', event.data);
  13. };
  14. // 监听错误事件
  15. eventSource.onerror = (error) => {
  16.     console.error('EventSource encountered an error:', error);
  17. };
复制代码
利用 EventSourcePolyfill 时,其 API 和标准EventSource完全兼容。
注意


定期发送心跳包

EventSourcePolyfill 支持自定义重连时间隔断,可以通过 heartbeatTimeout 设置选项来设置。
利用示例

以下示例展示了怎样利用 EventSourcePolyfill 的 heartbeatTimeout 参数来设置重连隔断:
  1. import { EventSourcePolyfill } from 'event-source-polyfill';
  2. // 设置重连时间间隔(单位为毫秒)
  3. const eventSource = new EventSourcePolyfill('http://localhost:3000/events', {
  4.     heartbeatTimeout: 10000 ,// 10秒
  5.     headers: {
  6.      Authorization:token?token:"Bearer niuniu",
  7.     }
  8. });
  9. // 监听事件
  10. eventSource.onmessage = (event) => {
  11.     console.log('Message event:', event.data);
  12. };
复制代码
参数表明


服务端的心跳设置

通常,为了保持连接状态,服务端也可以每隔一段时间发送一个空的数据包作为心跳,比方:
  1. // 服务端心跳实现示例
  2. setInterval(() => {
  3.     res.write(':\n\n');  // ":" 是注释行,不会被客户端处理,但保持连接活跃
  4. }, 10000);  // 10秒
复制代码
如允许以淘汰客户端的自动重连频率,优化网络资源。

什么是res.flushHeaders()

res.flushHeaders() 是 Express(基于 Node.js 的 HTTP 响应对象)的一个方法,作用是在不发送响应主体的情况下立即将响应头发送给客户端。这在处置惩罚流式响应(如 Server-Sent Events 或文件流下载)时特别有效。
用法和作用

通常,Express 在发送响应主体之前会自动发送响应头,但偶尔我们希望在发送内容之前就发送响应头信息。res.flushHeaders() 就是为这种情况设计的:

利用示例

在实现 SSE 时,通常会用到 res.flushHeaders() 以保证头信息在内容流发送之前发送:
  1. app.get('/events', (req, res) => {
  2.   // 设置响应头
  3.   res.setHeader('Content-Type', 'text/event-stream');
  4.   res.setHeader('Cache-Control', 'no-cache');
  5.   res.setHeader('Connection', 'keep-alive');
  6.   // 强制立即发送响应头
  7.   res.flushHeaders();
  8.   // 发送数据流
  9.   setInterval(() => {
  10.     res.write(`data: ${JSON.stringify({ message: "Hello, SSE!" })}\n\n`);
  11.   }, 3000);
  12. });
复制代码
注意事项


典型应用场景


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4