Angular与Node.js集成SSE:跨模块事件无法触发问题
集群环境下Server-Sent Events(SSE)的实现问题
我正在搭建Server-Sent Events(SSE),服务器存在耗时较长的进程,希望进程完成后由服务器主动推送消息,而非维持长连接。已确认Angular端配置正常,问题出在Node.js端。
sse-controller.js(Angular调用的接口)
const express = require("express"); const app = (module.exports = express()); const service = require('./sse-service'); app.get('/api/sse', async (req, res) => { await service.createStream(res); });
sse-service.js
const Stream = new (require('events')).EventEmitter(); const createStream = async (res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive', }); Stream.on('push' , (event, data) => { res.write('event: ' + String(event) + '\n' + 'data: ' + JSON.stringify(data) + '\n\n'); }); Stream.emit('push', 'message', 'data'); } const emitStream = async (message, data) => { Stream.emit('push', message, data); } module.exports = { createStream, emitStream, }
其他触发事件的模块
const sse = require("../SSE/sse-service"); const calculateTotals = () => { // 耗时逻辑... sse.emitStream('completed', 'totals'); }
当前现象:createStream内部调用Stream.emit可正常触发并被前端接收,但从其他模块调用sse.emitStream时,虽函数被执行,事件却未被捕获。
排查更新
- 事件名曾用'messages'导致响应异常,需改为'message';
- 核心问题:服务器启用了Cluster集群,客户端连接与事件触发分属不同进程,单进程下功能正常。
现寻求集群环境下SSE的简易实现方案,也可考虑替代方案。
补充更新
事件接收异常的前端根源:Angular端使用EventSource时仅定义了onmessage和onerror,因此仅能识别'message'或'error'事件。
内容的提问来源于stack exchange,提问作者Gary Dickerson
相关产品推荐
相关产品推荐

