Я играю с модулями graphql и обнаружил ситуацию, которая выше моего понимания. Этот случай просто для лучшего понимания graphqlmodules, его объявления контекста и внедрения, но я нашел его интересным, поэтому я хочу поделиться. (Также я думаю, что я не в состоянии решить эту проблему).
Кстати. Весь проект находится в комбинации машинопись / nodejs.
Я получил 4 файла: api.ts
, impl.ts
, test.ts
, index.ts
api.ts
определяет идентификатор услуги
import {ServiceIdentifier} from "@graphql-modules/di";
export const Identifier: ServiceIdentifier<number> = Symbol();
impl.ts
определяет поставщика этой услуги и root модуль ql
, который включает в себя тестовый модуль test
от test.ts
import {FactoryProvider} from '@graphql-modules/di'
import {Identifier} from "./api";
import {GraphQLModule} from "@graphql-modules/core";
import {test} from "./test";
export const IdentifierProvider: FactoryProvider<number> = {
provide: Identifier,
useFactory: () => 1
}
export const ql = new GraphQLModule({
imports: [test]
})
test.ts
определяет «нормальные» запросы graphql, но использует службы. Он импортирует поставщика услуг из impl.ts
.
import {GraphQLModule, ModuleContext} from "@graphql-modules/core";
import gql from "graphql-tag";
import {Identifier} from "./api";
import {IdentifierProvider} from "./impl";
export const test = new GraphQLModule({
typeDefs: gql`
type Test {
test: String!
}
schema {
query: Test
}
`,
resolvers: {
Test: {
test: (_: unknown, __: unknown, {injector}: ModuleContext) => {
console.log(injector.has(Identifier))
return ''
}
}
},
providers: [IdentifierProvider]
})
Здесь вы можете заметить круговую зависимость - impl.ts
импортирует test
из test.ts
и test.ts
импортирует IdentifierProvider
из impl.ts
- и я думаю, что это главная проблема.
Затем index.ts
, который просто запускает сервер Graphql.
import {GraphQLServer} from "graphql-yoga";
import {ql} from "./impl";
const server = new GraphQLServer(ql)
server.start({port: 8080})
Когда вы пытаетесь выполнить запрос: Test.test you в терминале появится булево значение В этом случае вы получите false
, но если вы встраиваете переменную ql
прямо в index.ts
, вы получите true
.
import {GraphQLServer} from "graphql-yoga";
import {GraphQLModule} from "@graphql-modules/core";
import {test} from "./test";
const server = new GraphQLServer(new GraphQLModule({
imports: [test]
}))
server.start({port: 8080})
Никаких изменений не было сделано, просто index.ts
Можете ли вы объяснить, почему это происходит?