Как узнать, какие дочерние резольверы необходимы в запросе apollo graphql? - PullRequest
0 голосов
/ 04 марта 2019

Я написал запрос grapqhl, как показано ниже

например,

   posts {
      author {
        comments {
         }
       }
     comments
    }

Я хочу узнать от posts resolver - как я могу получить подробную информацию о other resolvers, необходимомвперед?

Я хочу сделать это, чтобы избежать вложенных вызовов распознавателей, я написал сервер API, который GraphQl-сервер вызывает 'DataSources' для получения данных.

Я могуизмените сервер api, чтобы получить все данные одновременно.

Я использую apollo-server 2.0, и приветствуются любые другие способы избежать вложенных вызовов.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вам нужно будет проанализировать объект info, переданный в резольвер, как его четвертый параметр.Это тип объекта:

type GraphQLResolveInfo = {
  fieldName: string,
  fieldNodes: Array<Field>,
  returnType: GraphQLOutputType,
  parentType: GraphQLCompositeType,
  schema: GraphQLSchema,
  fragments: { [fragmentName: string]: FragmentDefinition },
  rootValue: any,
  operation: OperationDefinition,
  variableValues: { [variableName: string]: any },
}

Вы можете самостоятельно пересечь AST поля, но вам, вероятно, лучше использовать существующую библиотеку.Я бы порекомендовал graphql-parse-resol-info .Существует целый ряд других библиотек, но graphql-parse-resolve-info является довольно полным решением и фактически используется под капотом postgraphile.Пример использования:

posts: (parent, args, context, info) => {
  const parsedResolveInfo = parseResolveInfo(info)
  console.log(parsedResolveInfo)
}

Это позволит зарегистрировать объект по следующим строкам:

{
  alias: 'posts',
  name: 'posts',
  args: {},
  fieldsByTypeName: {
    Post: {
      author: {
        alias: 'author',
        name: 'author',
        args: {},
        fieldsByTypeName: ...
      }
      comments: {
        alias: 'comments',
        name: 'comments',
        args: {},
        fieldsByTypeName: ...
      }
    }
  }
}

Вы можете пройти через полученный объект и построить свой запрос SQL (или набор запросов API, иликак угодно) соответственно.

0 голосов
/ 04 марта 2019

Вот пара основных моментов, которые вы можете использовать для оптимизации ваших запросов для повышения производительности.

  1. В вашем примере было бы очень полезно использовать https://github.com/facebook/dataloader. Если вы загружаете комментарии в свои средства распознавания через загрузчик данных, вы убедитесь, что они вызываются только один раз.Это значительно сократит количество обращений к базе данных, так как в вашем запросе демонстрируется проблема N + 1.
  2. Я не уверен, какую именно информацию вам необходимо получить в постах заранее, но если вы знаете постидентификаторы, которые вы можете рассмотреть, чтобы посмотреть в будущее, передав в комментарии уже известные идентификаторы.Это гарантирует, что вам не нужно ждать сообщений, вы будете избегать вызовов дерева графиков и можете разрешать комментарии, не ожидая сообщений.Это отличная статья для оптимизации запросов водопада GraphQL, и, возможно, вы подскажете, как оптимизировать запросы с помощью загрузчика данных, и посмотрите вперед https://blog.apollographql.com/optimizing-your-graphql-request-waterfalls-7c3f3360b051
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...