Нужно использовать делегат ToSchema в резольвере гнезд js - PullRequest
0 голосов
/ 30 января 2020

У меня есть локальная схема и удаленная схема. Локальная схема содержит подмножество удаленной схемы и должна передавать их на удаленный сервер graphql.

Обычно я бы использовал что-то вроде:

public async getCar(
  obj: any,
  args: any,
  context: any,
  info: any
): Promise<Car> {
  return info.mergeInfo.delegateToSchema({
    args: {
      id: context.userId,
    },
    context: {},
    fieldName: 'car',
    info,
    operation: 'query',
    schema: carExecutableSchema,
    transforms: [],
  });
}

, но mergeInfo недоступно в поле info.

Чтобы получить удаленную схему, я использую:

const fetchRemoteSchema = async (): Promise<GraphQLSchema> => {
  const http = new HttpLink({
    fetch: nodeFetch,
    uri: process.env.CAR_GRAPHQL_URL,
  });

  const link = setContext((request, previousContext) => ({
    headers: {
      Authorization: `Basic ${process.env.CAR_BASIC_AUTH_TOKEN}`,
    },
  })).concat(http);

  const carSchema = await introspectSchema(link);

  const executableSchema = makeRemoteExecutableSchema({
    link,
    schema: carSchema,
  });
  return executableSchema;
};

, и я использую это в модуле для инициализации graphql

GraphQLModule.forRootAsync({
    imports: [CarModule],
    inject: [CarService],
    useFactory: (mainAppService: MainAppService) => ({
      context: async ({ req }) => {
        return {
          userId: 1
        };
      },
      definitions: {
        outputAs: 'interface',
        path: '../../myschema.gql',
      },
      typePaths: ['./**/*.graphql'],
    }),
  }),

Как я могу сделать mergeInfo доступным? Или есть более простой способ делегировать запрос graphql?

1 Ответ

0 голосов
/ 25 февраля 2020

info.mergeInfo доступно только в том случае, если ваша схема создана с mergeSchemas([]). Вы можете импортировать delegateToSchema как функцию: import { delegateToSchema } from "apollo-server-express";

...