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

实现SSE时遭遇onmessage类型错误,求解决方案

解决Angular中SSE EventSourcePolyfill的onmessage类型不兼容问题

问题根源

event-source-polyfill库内部定义了独立的MessageEvent接口,与浏览器全局的MessageEvent结构不一致,导致回调函数参数类型匹配失败。

解决方案

直接使用event-source-polyfill提供的MessageEvent类型,替换全局类型引用即可:

  1. 导入polyfill的MessageEvent类型
    在代码顶部添加从event-source-polyfill导入MessageEvent的语句。
  2. 统一回调与Observable的泛型类型
    将回调函数的参数类型、Observable的泛型都替换为polyfill的MessageEvent。

修改后的完整代码

import {Injectable} from "@angular/core";
import {Observable} from "rxjs";
import {AService} from "./a.service";
import {EventSourcePolyfill, MessageEvent} from "event-source-polyfill"; // 导入库的MessageEvent类型

@Injectable({
    providedIn: "root",
})
export class SseService {
    private eventSource!: EventSourcePolyfill | null;

    public constructor(private aService: AService) {}

    public getServerSentEvent(url: string): Observable<MessageEvent> {
        const token = this.aService.config.authorization;
        const headers = {Authorization: `Bearer ${token}`};

        return new Observable<MessageEvent>((observer) => {
            this.eventSource = new EventSourcePolyfill(url, {
                withCredentials: false,
                headers,
            });

            this.eventSource.onmessage = (event: MessageEvent): void => {
                observer.next(event);
            };

            this.eventSource.onerror = (error): void => {
                observer.error(error);
            };

            return () => {
                this.eventSource?.close();
            };
        });
    }

    public closeEventSource(): void {
        if (this.eventSource) {
            this.eventSource.close();
            this.eventSource = null;
        }
    }
}

补充说明

  • 该方案无需自定义类型,直接复用库提供的类型定义,彻底解决类型不兼容问题。
  • 保留了通过Header传递token的逻辑,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:33:31