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

EventSource(SSE)部署至服务器后数据仅在连接关闭时返回,求排查

SSE部署后无法实时推送消息的问题

本地运行时,每次调用res.write后消息都能实时返回,但部署到服务器后,所有消息仅在EventSource连接关闭时才一次性返回,表现得和普通HTTP请求一样。

相关代码

前端代码

const event_source = new EventSource("https://test.com/sse");

event_source.addEventListener('message', (message) => {
    console.log(message)
}, false);

event_source.addEventListener('open', (_e) => {
    console.log('EventSource Connected !');
}, false);

event_source.addEventListener('error', (err) => {
    //Close Event Source
}, false);

后端代码

let aa = 0
setInterval(() => {
  aa++
  if (aa === 5) {
    return r(aa)
  }
  res.write(`event: aa\n`)
  res.write(`data: sefa -> ${aa}\n\n`)
}, 1000)

Nginx配置

location /sse {
  proxy_pass http://localhost:3005;
}

问题原因及解决办法

问题根源在Nginx的默认代理配置:Nginx会对代理的HTTP响应做缓冲,只有缓冲区填满或连接关闭时才会把内容发给客户端,直接阻断了SSE的实时推送能力。

修改Nginx配置,禁用缓冲并开启长连接支持:

location /sse {
    proxy_pass http://localhost:3005;
    # 禁用响应缓冲,确保实时推送
    proxy_buffering off;
    # SSE需要HTTP/1.1的长连接支持
    proxy_http_version 1.1;
    # 清除Connection头,避免被替换为close
    proxy_set_header Connection '';
    # 指定SSE对应的Content-Type
    proxy_set_header Content-Type text/event-stream;
    # 禁用缓存
    proxy_cache off;
}

另外,后端代码里需要手动刷新输出缓冲区(以Node.js为例),确保每次res.write后数据立即发送:

let aa = 0
setInterval(() => {
  aa++
  if (aa === 5) {
    res.end(); // 结束连接,原代码的r(aa)应为结束连接逻辑
    return;
  }
  res.write(`event: aa\n`)
  res.write(`data: sefa -> ${aa}\n\n`)
  res.flush(); // 强制刷新缓冲区
}, 1000)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:23:16