Angular Apollo inject URI into 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但无济于事!建议?

我在这个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) {}

享受!

最新更新