#angular #provider #eventsource
#angular #поставщик #eventsource
Вопрос:
Я использую Angular 10 и пытаюсь прослушивать события, отправленные сервером из node.js Сервер ОТДЫХА. Я новичок в 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);
})
}
});
}
}
Ответ №1:
Было бы легче помочь, если бы мы могли видеть некоторые фрагменты кода, но смотрели на ошибку
NullInjectorError: нет поставщика для EventSource
В документах по внедрению зависимостей Angular отсутствуют некоторые зависимости, что может означать, что где-то в вашем коде вы создали класс обслуживания like export class EventSource { ... }
, а затем в другом вы пытаетесь предоставить его в конструкторе
class AnotherClass{
constructor(private myEventSource: EventSource)
}
но для того, чтобы это сработало, вам нужно будет сообщить DI о ваших новых документах класса, что можно сделать, добавив аннотацию
@Injectable({
providedIn: 'root',
})
export class EventSource {
...
}
Другая возможность заключается в том, что вы хотели использовать уже доступные EventSource
документы класса javascript, а затем вместо передачи его в конструктор попробуйте просто создать его в конструкторе
class AnotherClass{
private myEventSource
constructor(){
this.myEventSource = new EventSource(..)
}
}
Если это была проблема, вы можете позже предоставить ее и в Angular DI, это было предложено в качестве потенциального быстрого решения.