Пользовательский 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)));
}
}