javascript通过eventsource api实现sse单向推送:客户端用eventsource连接并监听onmessage/onerror,服务端返回text/event-stream响应头、按sse格式(data:、\n\n分隔)持续写入数据,需处理跨域、编码、连接保持等细节。

JavaScript 使用 EventSource API 就能轻松实现服务器单向消息推送,核心是建立一个持久的 HTTP 连接,让服务端持续写入符合 SSE 格式的数据流。
客户端:用 EventSource 建立连接并监听事件
浏览器原生支持,无需额外库。关键点包括正确处理连接、消息和错误:
- 创建
EventSource实例时传入服务端 SSE 接口地址(如/api/stream) -
onmessage处理默认事件(即未指定event:类型的消息) -
addEventListener('custom_name', ...)可监听服务端发送的自定义事件类型 -
onerror中建议检查eventSource.readyState:0=关闭、1=打开中、0=连接失败;非 0 状态下不需手动close(),否则会干扰自动重连 - 若需控制重连间隔,可在服务端响应头中设置
retry: 5000(单位毫秒),客户端会按此值重试
服务端:返回 text/event-stream 并保持连接
服务端必须满足三项基本要求:
- 响应头设置
Content-Type: text/event-stream,同时禁用缓存:Cache-Control: no-cache、Connection: keep-alive - 响应体严格遵循 SSE 格式:每条消息以
data:开头,内容为 UTF-8 文本,结尾用两个换行符\n\n分隔;可选加event:(指定事件名)、id:(用于断线续传)、retry:(重连时间) - 保持 HTTP 连接打开,持续写入数据(如 Node.js 中用
res.write()),不要调用res.end()直到主动结束
常见问题与避坑提示
实际开发中容易卡在几个细节上:
- 跨域问题:服务端必须显式设置
Access-Control-Allow-Origin,且不能为通配符*当带凭证(credentials)时;推荐设为具体域名 - 消息解析失败:客户端收不到
onmessage,大概率是服务端输出格式错误——比如漏了\n\n、混入空格或用了非 UTF-8 字符 - 连接频繁重试:检查服务端是否意外关闭了连接(如未处理
req.on('close')导致异常退出),或客户端误调eventSource.close() - IE 不支持:SSE 在 IE 全系缺失,如需兼容,得降级为长轮询或引入 polyfill
一个最小可行示例(前后端联动)
前端只需三行:
const es = new EventSource('/api/tick');<br>es.onmessage = e => console.log('tick:', e.data);<br>es.onerror = e => console.error('SSE error', e);
后端(Express 示例)关键逻辑:
res.writeHead(200, {<br> 'Content-Type': 'text/event-stream',<br> 'Cache-Control': 'no-cache',<br> 'Connection': 'keep-alive'<br>});<br>let i = 0;<br>const interval = setInterval(() => {<br> res.write(`data: ${JSON.stringify({count: ++i})}\n\n`);<br>}, 1000);<br>// 客户端断开时清理<br>req.on('close', () => { clearInterval(interval); res.end(); });Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











