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

Angular前端用EventSource连Mercure仅获{isTrusted: true},如何获取正常错误格式?

问题

基于Angular框架的前端,使用JavaScript的EventSource连接Mercure服务器事件时,触发错误(比如模拟授权错误),浏览器仅返回{isTrusted: true}。

已了解这是浏览器导致的脚本错误,尝试过用try/catch捕获错误,也按相关要求配置了请求头,但问题仍未解决。

以下是当前的错误处理代码:

this.eventSource.onerror = (error: ErrorEvent): void => {
      console.log(error);
      if (attempts === 0) {
        this._logger
          .sendToRemote$({
            id: traceId,
            log_level: 'ERROR',
            log_message: `Mercure connection dropped, after ${EVENT_SOURCE_RECONNECT_ATTEMPTS} failed attempts`,
            BODY: JSON.stringify({ message: error.message, fileName: error.filename, lineNumber: error.lineno }),
            STEP: 'ERROR',
            traceId,
            context_data: {
              sessionUid
            }
          })
          .pipe(take(1))
          .subscribe();
      }

      if (attempts > 0) {
        setTimeout(() => {
          this.startEventSource(attempts - 1);
        }, 2000);
      }
      throw error;
    };

请问如何获取正常的错误格式?

解决方案
  • 检查Mercure响应状态与内容
    原生EventSource.onerror不会直接返回详细错误,但可以通过eventSource.readyState判断连接状态。错误触发后,用XMLHttpRequest或Fetch重新发起相同请求,直接获取服务器返回的状态码(如401、403)和响应内容,以此推断具体错误原因。

  • 用Mercure自定义事件传递错误
    配置Mercure服务器,在授权失败等场景下主动发送自定义错误事件(比如error-detail),前端通过eventSource.addEventListener('error-detail', (event) => { ... })监听,解析事件的data字段获取详细错误信息。

  • 调整CORS与跨源权限配置
    确保Mercure服务器返回的CORS响应头包含Access-Control-Allow-Credentials: true(若请求带Cookie),同时检查Access-Control-Expose-Headers是否包含必要的响应头,让前端能读取服务器返回的错误相关头信息。另外确认服务器端未限制错误信息返回,避免跨源策略导致浏览器隐藏具体错误。

  • 用Fetch API模拟SSE逻辑
    如果原生EventSource的错误信息受限,可以用Fetch API配合ReadableStream手动实现SSE功能,这样能直接获取完整的Response对象(包含状态码、响应头和错误内容),同时自行处理重连逻辑。示例代码如下:

const fetchSSE = async (url, options) => {
  const response = await fetch(url, options);
  if (!response.ok) {
    const errorText = await response.text();
    throw new Error(`HTTP error! Status: ${response.status}, Message: ${errorText}`);
  }
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    const data = decoder.decode(value);
    // 处理SSE数据
    console.log('Received:', data);
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:40:04