当前位置: 首页 > news >正文

NodeJS搭建SSE接口服务

下面是一个基于Node.js的SSE(Server-Sent Events)接口服务的实现。这个示例使用Express框架搭建服务器,支持客户端订阅事件流并实时接收服务器推送的数据。

const express = require('express');
const cors = require('cors');
const { v4: uuidv4 } = require('uuid');const app = express();
const PORT = 3000;// 中间件
app.use(cors());
app.use(express.json());// 存储客户端连接
const clients = new Map();// SSE 接口
app.get('/sse', (req, res) => {// 设置 SSE 响应头res.setHeader('Content-Type', 'text/event-stream');res.setHeader('Cache-Control', 'no-cache');res.setHeader('Connection', 'keep-alive');res.flushHeaders();// 生成客户端ID并存储连接const clientId = uuidv4();const client = {id: clientId,res};clients.set(clientId, client);// 发送初始消息sendEvent(clientId, { type: 'connected', data: { clientId } });// 处理客户端断开连接req.on('close', () => {clients.delete(clientId);console.log(`Client ${clientId} disconnected`);});
});// 向特定客户端发送事件
function sendEvent(clientId, event) {const client = clients.get(clientId);if (client) {client.res.write(`data: ${JSON.stringify(event)}\n\n`);}
}// 向所有客户端广播事件
function broadcastEvent(event) {clients.forEach(client => {client.res.write(`data: ${JSON.stringify(event)}\n\n`);});
}// 模拟定时推送数据
setInterval(() => {broadcastEvent({type: 'update',data: {timestamp: new Date().toISOString(),message: '定时更新数据'}});
}, 5000);// 手动触发推送接口
app.post('/trigger', (req, res) => {const { message } = req.body;broadcastEvent({type: 'manual',data: {timestamp: new Date().toISOString(),message}});res.json({ success: true });
});// 启动服务器
app.listen(PORT, () => {console.log(`Server running on port ${PORT}`);
});

代码说明:

  1. 依赖安装

    npm install express cors uuid
    
  2. 核心功能

    • SSE连接管理:使用Map存储所有客户端连接,每个连接有唯一ID。
    • 事件发送
      • sendEvent(clientId, event):向特定客户端发送事件。
      • broadcastEvent(event):向所有客户端广播事件。
    • 响应头设置
      Content-Type: text/event-stream
      Cache-Control: no-cache
      Connection: keep-alive
      
  3. 接口说明

    • GET /sse:客户端订阅SSE流的入口。
    • POST /trigger:手动触发向所有客户端推送消息(需提供message字段)。
  4. 客户端示例

    const eventSource = new EventSource('http://localhost:3000/sse');eventSource.onmessage = (event) => {const data = JSON.parse(event.data);console.log('收到消息:', data);
    };eventSource.onerror = (error) => {console.error('SSE连接错误:', error);
    };
    

特性与扩展:

  • 心跳机制:可添加定期发送心跳消息以保持连接。
  • 错误处理:包含基本的连接断开处理。
  • 事件类型:支持不同类型的事件(connected, update, manual)。
  • 安全增强:可添加身份验证、权限控制等。

这个实现提供了SSE服务的基础框架,你可以根据具体需求扩展其功能,如添加用户认证、事件过滤、持久化存储等。

http://www.lryc.cn/news/599465.html

相关文章:

  • 【C#补全计划:类和对象(七)—— 重写虚方法】
  • 重构 MVC:让经典架构完美适配复杂智能系统的后端业务逻辑层(内附框架示例代码)
  • 图片查重从设计到实现(4)图片向量化存储-Milvus 单机版部署
  • 【大模型实战】提示工程(Prompt Engineering)
  • 《基于电阻抗断层扫描(EIT)驱动的肌肉骨骼模型表征人体手臂动态意图用于人机交互》论文解读
  • SpringBoot实战指南:从快速入门到生产级部署(2025最新版)
  • Linux进程信号——信号保存
  • RWA项目面临的主要风险有哪些?例如市场风险、技术风险和法律风险。
  • 比特币技术简史 第九章:比特币的未来 - 发展趋势、挑战和机遇
  • Linux: network: wireshark: esp attempt to detec null-encrypted esp payloads
  • Linux: network: wireshark: tcp的segment重组是怎么判断出来的
  • Comfyui中Upscale Image By 几种放大方法的区别
  • Oracle转Mysql建表脚本
  • mysql 和oracle的选择
  • 【矩阵专题】Leetcode48.旋转图像(Hot100)
  • 【源力觉醒 创作者计划】ERNIE-4.5-VL-28B-A3B 模型详解:部署、测试与 Qwen3 深度对比测评
  • leetcode_122 买卖股票的最佳时机II
  • Axios基本使用
  • 分别使用 Java 8 和 Python 调用 Elasticsearch 接口简单获取数据
  • Web前端:JavaScript 随机点名系统案例详解
  • 常用设计模式系列(十二)—享元模式
  • OpenTelemetry学习笔记(十二):在APM系统中,属性的命名空间处理遵循规则
  • 基于讯飞星火AI的文学作品赏析系统开发实战:从通用聊天到专业文学分析的完整技术方案
  • 新房装修是中央空调还是壁挂空调好?
  • 滑动窗口---6(稍难)
  • GDB调试命令学习
  • 【开源软件】SimpleAI一款轻量级的桌面随身AI助手
  • 航段导航计算机 (Segment_Navigator) 设计与实现
  • OSPF 协议(多区域)
  • Python智能优化算法实战指南