Express JS Server-Sent Event本地正常 线上服务器报503错误求助
Express SSE线上部署后返回503故障排查
我用Express开发的Server-Sent Event(SSE)功能在本地运行正常,但部署到线上服务器后无法工作,服务器返回503状态码。已确认客户端发送的token正确,排除token问题。
后端服务器代码
res.set({ "Content-Type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", }); try { const readusers = await ReadComments.find({}); if (!readusers) { return res.status(404).send("No comments found"); } // 发送初始数据给客户端 res.write(`data: ${JSON.stringify(readusers)} `); // 设置定时任务发送更新数据 const intervalId = setInterval(async () => { const updatedData = await ReadComments.find({}); res.write(`data: ${JSON.stringify(updatedData)} `); }, 3000); // 客户端断开连接时清除定时任务 req.on("close", () => { clearInterval(intervalId); }); } catch (error) { return res.status(500).send(error.message); } });
客户端代码
useEffect(() => { let source = new EventSource(`https://crowded-turtleneck-eel.cyclic.app/comment?token=${localstorageToken}`); source.onmessage = async(event) => { let parsedEventData = await JSON.parse(event.data).filter((filterdMovie) => { return filterdMovie.movieId === props.reviewProps.id }) const sortedArray = sortByCreatedAt(parsedEventData) setFeedCard(sortedArray) }; }, []);
排查与解决方向
- 平台长连接限制:你使用的Cyclic平台可能对SSE这类长连接有超时或并发数限制,503状态码通常表示服务暂时不可用,去平台控制台查看是否有连接时长、并发数的限制规则,是否需要额外配置保持连接参数。
- 反向代理配置问题:线上环境如果有Nginx这类反向代理,必须配置支持SSE:
- 添加
proxy_set_header Connection "keep-alive"; - 禁用代理缓存:
proxy_cache off; - 延长读取超时:
proxy_read_timeout 86400s;
- 添加
- 完善后端错误处理:
res.write在连接断开时可能抛出未捕获错误,导致服务异常,需要在定时任务里加错误捕获:const intervalId = setInterval(async () => { try { const updatedData = await ReadComments.find({}); res.write(`data: ${JSON.stringify(updatedData)}
`);
res.flushHeaders(); // 强制刷新响应,确保数据发送
} catch (err) {
clearInterval(intervalId);
console.log("SSE连接已断开", err);
}
}, 3000);
- **客户端错误监听**:给EventSource加上错误监听,获取更详细的错误信息: ```javascript source.onerror = (error) => { console.error("SSE错误详情:", error); source.close(); };
- 端口与防火墙检查:确认线上服务器的对应端口已开放,防火墙没有拦截长连接请求。
内容的提问来源于stack exchange,提问作者Ayomikun
相关产品推荐
相关产品推荐

