You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,虽函数被执行,事件却未被捕获。


排查更新

  1. 事件名曾用'messages'导致响应异常,需改为'message';
  2. 核心问题:服务器启用了Cluster集群,客户端连接与事件触发分属不同进程,单进程下功能正常。

现寻求集群环境下SSE的简易实现方案,也可考虑替代方案。

补充更新

事件接收异常的前端根源:Angular端使用EventSource时仅定义了onmessage和onerror,因此仅能识别'message'或'error'事件。


内容的提问来源于stack exchange,提问作者Gary Dickerson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:25:49