Angular - Apollo: клиент еще не определен

Я использую клиент 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 работать перед службой или любыми другими службами эффективным и стандартным способом?

Вы пробовали использовать OnInit жизненного цикла приложения? попробуйте реализовать интерфейс OnInit и перенести свой код в метод ngOnInit

Mehdi Benmoha 13.03.2018 14:44

Может быть, взгляните на токен APP_INITIALIZER

David 13.03.2018 14:47

Сервисы @e.m.b не имеют ngOnInit

Manzur Khan 13.03.2018 15:04

Я имел в виду переместить код в конструкторе модулей в ngOnInit в модулях, а не в сервисах.

Mehdi Benmoha 13.03.2018 16:12

@ e.m.b, который тоже не поможет, так как функция contructor запускается первой, помещая ее на ngOnIt, они загружаются даже по прошествии большего времени

Manzur Khan 13.03.2018 17:44

@David Я пробовал APP_INITIALIZER, но проблема в том, что мне нужно использовать myService, и если я предоставлю myService, я получаю ошибку циклической зависимости

Manzur Khan 14.03.2018 11:00

@ManzurKhan Вы когда-нибудь находили исправление для этого?

Winnemucca 25.04.2018 21:56

теперь вы можете инициализировать Apollo по-новому apollographql.com/docs/angular/basics/…

Kamil Kisiela 17.06.2018 00:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
8
5 267
3

Ответы 3

Это хорошо решит проблему:

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 не ставят это в качестве первого примера.

Morgan Touverey Quilling 17.07.2018 12:25

Вы только что переместили экземпляр Apollo внутри AppModule?

Rayhan Muktader 13.10.2019 03:27

После обновления до Apollo v3 - этот подход снова вызывает у меня проблему «Клиент еще не определен»

DauleDK 08.09.2020 15:02

@DauleDK, как ты это исправил?

Flavien Volken 25.02.2021 18:10

Мы переключили стек на Svelte / Sapper - нам так и не удалось исправить проблему в нашей команде.

DauleDK 25.02.2021 20:13

Ответ @wendellmva у меня не сработал. Какая работа сделал была решением, предложенным в этом репо:

https://github.com/patricknazar/angular-lazy-loading-apollo-client

который в основном заключается в том, чтобы поместить инициализацию Apollo в отдельный общий модуль и включить его в основной модуль приложения с помощью forRoot().

Эта ссылка больше не доступна.

Jared Kozak 19.06.2020 19:45

Не могли бы вы обновить ссылку на репозиторий?

jowey 15.02.2021 11:36

@jowey похоже, что владелец удалил его, и, к сожалению, я не подумал о его клонировании в то время. Наша установка сейчас немного сложнее, поэтому я не могу публиковать ее здесь. Возможно, обновилась официальная документация, как пишет ниже раффаваль?

AsGoodAsItGets 15.02.2021 18:09

Попробуйте это: apollo-angular.com/docs/get-started

AsGoodAsItGets 15.02.2021 18:11

У меня такая же проблема, и мне помогли документы от 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 {}

Другие вопросы по теме