Angular 10-服务器发送事件-缺少EventSource

问题描述

我正在使用Angular 10,并试图监听来自node.js REST服务器的服务器发送的事件。我是Angular的菜鸟(这是一个学校项目)。无论如何,我发现的所有教程都创建了一个服务,该服务实现EventSource并在收到块时订阅它们。一切都可以编译,但是当我浏览到使用该服务的页面时,出现此错误“ NullInjectorError:EventSource没有提供程序”。有人可以提供参考资料来帮助或告诉我克服错误要做什么吗?

要清楚,我不是在创建新的EventSource类,而是使用我理解为JavaScript内置类(https://developer.mozilla.org/en-US/docs/Web/API/EventSource)。

删除“ private _eventSource:EventSource”解决了该问题,这引发了另一个问题(我想我可能已经迷失了答案。)是否是这样,无法声明内置JavaScript类型的变量(如EventSource)?

这是我的代码...

import { Injectable,ngzone } from '@angular/core';
import { HttpClient } from '@angular/common/http'
import { Facility } from '../models/facility.model'
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class MyClass {

  constructor( 
    private _http: HttpClient,private _zone: ngzone,private _eventSource: EventSource   // removing this resolved the error
  ) { }


  getMyEventSourceStream() {

    return new Observable((observer) => {
      const eventSource = new EventSource(this._summaryUrl);

      eventSource.onopen = (event) => {
        console.log(event);
      }

      eventSource.onmessage = (event) => {
        console.log(event);
        this._zone.run(() => {
          observer.next(event);
        })
      };

      eventSource.onerror = (error) => {
        this._zone.run(() => {
          observer.error(error);
        })
      }
    });
  }
}

解决方法

如果我们可以看到一些代码片段,但是却看到错误,将更容易提供帮助

NullInjectorError:EventSource没有提供程序

Angular依赖注入docs中缺少一些依赖,这可能意味着您在代码中的某处创建了服务类,例如 export class EventSource { ... },然后在另一个实例中尝试在构造函数中提供它

class AnotherClass{
  constructor(private myEventSource: EventSource)
}

但是要使其正常工作,您需要让DI知道您的新类docs,这可以通过添加注释来实现

@Injectable({
  providedIn: 'root',})
export class EventSource {
    ...
}

其他可能性是您想使用已经可用的javascript类EventSource docs,然后与其将其传递给构造函数,而不仅仅是在构造函数中创建

class AnotherClass{
  private myEventSource
  constructor(){
    this.myEventSource = new EventSource(..)
  }
}

如果这是问题,您以后也可以在Angular DI中提供它,这是潜在的快速解决方案。