Пользовательский DataService NxRx-Data не использует DataSeviceConfiguration - PullRequest
1 голос
/ 05 марта 2020

Я расширил DefaultDataService следующим образом:

    @Injectable()
    export class DidDocumentDataService extends DefaultDataService<DidDocument> {
      constructor(http: HttpClient, httpUrlGenerator: HttpUrlGenerator) {
        super("DidDocument", http, httpUrlGenerator, defaultDataServiceConfig);
      }

      getById(): Observable<DidDocument> {
        return this.http.get("/identifiers").pipe(
          map(res => res["didDocument"])
        );
      }
    }

app-store.module.ts настроен так:

// this used to work before overriting the DefaultDataService
export const defaultDataServiceConfig: DefaultDataServiceConfig = {
  root: `${HOST}/1.0/`
};

@NgModule({
  imports: [
    EntityDataModule.forRoot(entityConfig),
    ... // other store related imports
  ],
  providers: [
    DidDocumentDataService,
    { provide: DefaultDataServiceConfig, useValue: defaultDataServiceConfig }
  ],
  declarations: [StoreComponent],
  exports: [StoreComponent]
})
export class AppStoreModule {
  constructor(
    private entityDataService: EntityDataService,
    private didDocService: DidDocumentDataService
  ) {
    this.entityDataService.registerService("DidDocument", this.didDocService);
  }
}

Перед расширением DefaultDataService использовался defaultDataServiceConfig и запросы были вызваны на заказ root. Теперь каждый запрос нажимает localhost (кажется, просто использует текущий хост).

AppStoreModule не является модулем с отложенной загрузкой и загружается в AppModule. Компонент, который вызывает запрос, является StoreComponent. Мое первое предположение состоит в том, что что-то происходит не в том порядке, в котором я этого ожидаю.

Когда CustomDataService с созданным CustomConfiguration создается и перезаписывает ли Служба работу только в лениво загруженных модулях?

Решение

Я устанавливаю абсолютный URL в httpClient напрямую, а также передаю идентификатор в метод getById:

getById(id: string): Observable<DidDocument> {
  return this.http.get(`${HOST}/1.0/identifiers/${id}`).pipe(
    map(res => res["didDocument"])
  );
}

1 Ответ

1 голос
/ 05 марта 2020

Причина root вашей проблемы, вероятно, в следующем коде:

getById(): Observable<DidDocument> {
  return this.http.get("/identifiers").pipe(
    map(res => res["didDocument"])
  );
}

В этом случае, даже если DefaultDataServiceConfig правильно установлен с правильным url, этот код переопределяет GET URL.

http.get("/identifiers")

эквивалентно

http.get("http://localhost/identifiers")

(если ваше приложение для разработки работает на localhost)

Вы должны либо установить абсолютное значение url, либо использовать предка методы DefaultDataService с super:

getById(): Observable<DidDocument> {
  return super.getById(id).pipe(
    map(res => res["didDocument"])
  );
}

Вы можете найти более подробную информацию в официальном do c, с этим примером фрагмента кода:

@Injectable()
export class HeroDataService extends DefaultDataService<Hero> {
  constructor(http: HttpClient, httpUrlGenerator: HttpUrlGenerator, logger: Logger) {
    super('Hero', http, httpUrlGenerator);
    logger.log('Created custom Hero EntityDataService');
  }

  getById(id: string | number): Observable<Hero> {
    return super.getById(id).pipe(map(hero => this.mapHero(hero)));
  }
}
...