Angular Apollo вводит URI в graphql.module.ts

Я нахожусь в процессе создания библиотеки Angular, которая включает код, связанный с auth/graphql, который требуется всем нашим приложениям.

Проблема в том, что я храню uri в переменной среды Angular, которой нет в библиотеках Angular.

Выполнение ng add apollo-angular генерирует следующий модуль:

graphql.module.ts (удален импорт для ясности):

const uri = ''; // <-- add the URL of the GraphQL server here
export function createApollo(httpLink: HttpLink) {
  return {
    link: httpLink.create({uri}),
    cache: new InMemoryCache(),
  };
}

@NgModule({
  exports: [ApolloModule, HttpLinkModule],
  providers: [
    {
      provide: APOLLO_OPTIONS,
      useFactory: createApollo,
      deps: [HttpLink],
    },
  ],
})
export class GraphQLModule {}

Обратите внимание на uri, который создает зависимость от этого модуля, который должен быть внедрен.

В своих приложениях app.module.ts я создал провайдер, который захватывает среду:

providers: [
    {
      provide: 'envVars', useValue: environment
    }
  ]

Который я обычно ввожу через конструктор следующим образом:

constructor(@Inject('envVars') private envVars: any) {}

Я пробовал много способов ввести этот uri безрезультатно! Предложения?


person Vippy    schedule 12.09.2019    source источник


Ответы (1)


Я нашел решение своей проблемы в этом сообщении StackOverflow:

https://stackoverflow.com/a/46791075/1207856

Однако я настроил свой для своей уникальной ситуации.

Сначала в AppModule app.module.ts предоставьте среду с помощью статического метода forRoot():

GraphQLModule.forRoot(environment)

Во-вторых, в вашем модуле библиотек вы можете установить эту среду как статический член вашего класса, как таковой:

export class GraphQLModule {
  public static envVars: any

  public static forRoot(environment: any): ModuleWithProviders {
    // this is to provide to this module non-class section
    this.envVars = environment

    // this is provide to children
    return {
      ngModule: GraphQLModule,
      providers: [
        {
            provide: 'envVars', 
            useValue: environment
        }
      ]
    }
  }
}

Теперь я могу использовать его статически в самом модуле или через @Inject в любом дочернем компоненте или модуле, который использует этот модуль.

Итак, в этом фактическом модуле я могу сделать это:

GraphQLModule.envVars.gatewayUri

или в конструкторе другого класса я могу сделать это:

constructor(@Inject('envVars') private envVars: any) {}

Наслаждаться!

person Vippy    schedule 12.09.2019