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

