Я использую клиент apollo для graphql. Я настроил клиент в AppApolloModule, который импортирую в AppModule. Я делаю запрос в сервисе, который также импортируется прямо в AppModule. Хотя служба запускается до запуска AppApolloModule и, следовательно, apollo не инициализируется при выполнении запроса, и я получаю эту ошибку
Error: Client has not been defined yet
AppApolloModule
imports ....
export class AppApolloModule {
constructor(
apollo: Apollo,
httpLink: HttpLink,
private userService: UserService
) {
console.info("apollo module")
apollo.create({
link: httpLink.create({ uri: `${environment.apiBase}/graphql?${this.myService.token}`}),
cache: new InMemoryCache()
})
}
}
Модуль приложения
import { AppApolloModule } from './app.apollo.module';
import { MyService } from './services/my.service';
export class AppModule {
constructor() {
console.info("app module")
}
}
Я не получаю модуль приложения для двух консолей и модуль apollo, поскольку служба запускается первой, она не находит ни одного инициализированного приложения apollo и, таким образом, нарушает код.
Как я могу заставить apollo работать перед службой или любыми другими службами эффективным и стандартным способом?
Может быть, взгляните на токен APP_INITIALIZER
Сервисы @e.m.b не имеют ngOnInit
Я имел в виду переместить код в конструкторе модулей в ngOnInit в модулях, а не в сервисах.
@ e.m.b, который тоже не поможет, так как функция contructor запускается первой, помещая ее на ngOnIt, они загружаются даже по прошествии большего времени
@David Я пробовал APP_INITIALIZER, но проблема в том, что мне нужно использовать myService, и если я предоставлю myService, я получаю ошибку циклической зависимости
@ManzurKhan Вы когда-нибудь находили исправление для этого?
теперь вы можете инициализировать Apollo по-новому apollographql.com/docs/angular/basics/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это хорошо решит проблему:
import {NgModule} from '@angular/core';
import {HttpClientModule} from '@angular/common/http';
import {ApolloModule, APOLLO_OPTIONS} from 'apollo-angular';
import {HttpLink, HttpLinkModule} from 'apollo-angular-link-http';
import {InMemoryCache} from 'apollo-cache-inmemory';
export function createApollo(httpLink: HttpLink) {
return {
link: httpLink.create({uri: 'https://api.example.com/graphql'}),
cache: new InMemoryCache(),
};
}
@NgModule({
imports: [HttpClientModule, ApolloModule, HttpLinkModule],
providers: [
{
provide: APOLLO_OPTIONS,
useFactory: createApollo,
deps: [HttpLink],
},
],
})
class AppModule {}
Ура! Намного лучше вот так. Жаль, что документы Apollo не ставят это в качестве первого примера.
Вы только что переместили экземпляр Apollo внутри AppModule?
После обновления до Apollo v3 - этот подход снова вызывает у меня проблему «Клиент еще не определен»
@DauleDK, как ты это исправил?
Мы переключили стек на Svelte / Sapper - нам так и не удалось исправить проблему в нашей команде.
Ответ @wendellmva у меня не сработал. Какая работа сделал была решением, предложенным в этом репо:
https://github.com/patricknazar/angular-lazy-loading-apollo-client
который в основном заключается в том, чтобы поместить инициализацию Apollo в отдельный общий модуль и включить его в основной модуль приложения с помощью forRoot().
Эта ссылка больше не доступна.
Не могли бы вы обновить ссылку на репозиторий?
@jowey похоже, что владелец удалил его, и, к сожалению, я не подумал о его клонировании в то время. Наша установка сейчас немного сложнее, поэтому я не могу публиковать ее здесь. Возможно, обновилась официальная документация, как пишет ниже раффаваль?
Попробуйте это: apollo-angular.com/docs/get-started
У меня такая же проблема, и мне помогли документы от Apollo. Перейдите в 'https://www.apollographql.com/docs/angular/basics/setup/' или скопируйте это:
import { HttpClientModule } from "@angular/common/http";
import { ApolloModule, APOLLO_OPTIONS } from "apollo-angular";
import { HttpLinkModule, HttpLink } from "apollo-angular-link-http";
import { InMemoryCache } from "apollo-cache-inmemory";
@NgModule({
imports: [
BrowserModule,
HttpClientModule,
ApolloModule,
HttpLinkModule
],
providers: [{
provide: APOLLO_OPTIONS,
useFactory: (httpLink: HttpLink) => {
return {
cache: new InMemoryCache(),
link: httpLink.create({
uri: "https://o5x5jzoo7z.sse.codesandbox.io/graphql"
})
}
},
deps: [HttpLink]
}],
})
export class AppModule {}
Вы пробовали использовать OnInit жизненного цикла приложения? попробуйте реализовать интерфейс OnInit и перенести свой код в метод ngOnInit