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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:20:47