问题描述
我正在使用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中提供它,这是潜在的快速解决方案。