Apollo GraphQL разрешает поле перед вызовом `willResolveField`. Как и где на самом деле происходит поле «решимость»? - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь создать собственное расширение Apollo для сбора некоторых метрик производительности (продолжительности выполнения) распознавателей и записи их в инструмент APM. Из документации Apollo , выпуска Github здесь и примера , опубликованного Apollo, я обнаружил, что метод willResolveField при переопределении получает GraphQLResolveInfo (который в свою очередь имеет родительский тип parentType и имя поля fieldName). Если можно заметить, поля уже разрешены, когда этот метод вызывается сервером Apollo. Знает ли кто-нибудь, где на самом деле происходит разрешение этого поля, прежде чем отправить его на willResolveField?

С другой стороны, если мое понимание неверно - имя willResolveField, похоже, вводит в заблуждение. Может ли кто-нибудь пролить свет на это?

Пример кода того, чего я пытаюсь достичь

class GraphQLAPMExtension implements GraphQLExtension<TContext> {
 requestDidStart(options:{ request, operationName, ... }) {
  // perform APM specifics to log the request and other info
  return (...errors) => {
    if(errors.length) {
     // some more custom APM stuff!
    }
  }
 }

 willResolveField(source, args, context: TContext, info: GraphQLResolveInfo) {
  // info contains parentType and fieldName
  // and it seems to be that fields are already resolved and passed to this function
 }

}

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

После некоторого количества копания в пакете graphql. Похоже, что функция resolveFieldValueOrError делает разрешение. Его можно найти в разделе ./execution. Похоже, мне придется раскошелиться на проект graphQl и внести в него изменения, которые я sh.

Еще одним, более практичным направлением было отслеживание параметра трассировки создания сервера Apollo. После некоторого быстрого копания обнаружил, что он использует пакет apollo-engine-reporting.

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

Уже есть расширение для отслеживания запросов, встроенное в ApolloServer. Исходный код можно найти здесь . Похоже, вы могли бы просто раскошелиться на это.

...