Angular 10 — Сервер отправил события — отсутствует источник событий

#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, это было предложено в качестве потенциального быстрого решения.