Пользовательский DataService NxRx-Data не использует DataSeviceConfiguration

Я расширил 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 ответ

Решение

Основная причина вашей проблемы, вероятно, в этом коде:

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"])
  );
}

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

@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)));
  }
}
Другие вопросы по тегам