Почему GraphQLModule не может предоставить контекст в одной из двух почти одинаковых ситуаций? - PullRequest
0 голосов
/ 04 мая 2020

Я играю с модулями 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

Можете ли вы объяснить, почему это происходит?

...