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

如何捕获失败的EventSource连接的HTTP响应状态码?

获取EventSource连接失败时的HTTP状态码

好问题!当EventSource(SSE)连接失败时,默认的error事件不会直接把HTTP状态码递到你面前,得用点小技巧才能拿到。我给你整理了几种实用的方法,按场景选就行:

方法一:直接在error事件中读取状态码(现代浏览器首选)

大部分现代浏览器(Chrome、Firefox、Edge等)都允许你在error事件回调里,通过EventSource实例的status属性获取状态码。结合readyState判断连接状态,代码示例如下:

const eventSource = new EventSource('/your-sse-endpoint');

eventSource.onerror = function(event) {
  // 先确认连接已经关闭
  if (this.readyState === EventSource.CLOSED) {
    const statusCode = this.status;
    if (statusCode) {
      console.log(`SSE连接失败,HTTP状态码:${statusCode}`);
      // 这里可以根据状态码做不同处理,比如404提示端点不存在,500提示服务异常
    } else {
      console.log('SSE连接失败,但无法获取具体状态码(可能是跨域或纯网络故障)');
    }
  }
};

需要注意:旧版浏览器(比如IE系列)可能不支持status属性,所以如果你的项目要兼容这类环境,得考虑下面的方法。

方法二:用XMLHttpRequest预请求(兼容/可靠方案)

如果想确保无论浏览器版本如何都能拿到状态码,可以先通过XMLHttpRequest(XHR)对SSE端点发起一次预请求,验证状态后再建立EventSource连接。这种方法的好处是兼容性拉满,缺点是会多一次HTTP请求,要注意请求上下文的一致性(比如携带相同的Cookie或认证信息)。

代码示例:

function initSSEWithStatusCheck(endpointUrl) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', endpointUrl, true);
  // 要设置Accept头为text/event-stream,和EventSource的请求保持一致
  xhr.setRequestHeader('Accept', 'text/event-stream');
  
  xhr.onload = function() {
    if (xhr.status === 200) {
      // 状态码正常,正式建立SSE连接
      const es = new EventSource(endpointUrl);
      // 处理SSE消息
      es.onmessage = function(msgEvent) {
        console.log('收到SSE消息:', msgEvent.data);
      };
      // 处理后续错误
      es.onerror = function() {
        console.log('SSE连接运行中出现错误');
      };
    } else {
      console.log(`SSE端点预请求失败,HTTP状态码:${xhr.status}`);
      // 这里根据状态码做对应处理
    }
  };
  
  xhr.onerror = function() {
    console.log('网络故障,无法连接到SSE端点');
  };
  
  xhr.send();
}

// 调用方法
initSSEWithStatusCheck('/your-sse-endpoint');

注意跨域场景的限制

如果你的SSE请求是跨域的,得确保服务器配置了正确的CORS头。要是CORS配置不正确,浏览器会出于安全限制,隐藏具体的HTTP状态码,这时status属性会返回0,你只能知道连接失败,但拿不到具体的4xx/5xx状态码。这种情况下,先检查服务器的CORS配置是否允许你的域名发起SSE请求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:07:18