Как я могу использовать определитель по умолчанию сервера apollo с функцией? - PullRequest
0 голосов
/ 08 февраля 2019

В разделе распознавателей по умолчанию документации Graphql-tools говорится:

  1. Возвращает свойство из obj с соответствующим именем поля или
  2. Вызывает функцию в obj с соответствующим именем поля и передает аргументы запроса в эту функцию

https://www.apollographql.com/docs/graphql-tools/resolvers.html#Default-resolver

Тип определения:

type AggregateMessage {
  count: Int!
}

Для данного преобразователя запросов:

Query: {
    async messagesConnection(root: any, args: any, context: any, info: any) {
      const messages: IMessageDocument[] = await messageController.messages();

      const edges: MessageEdge[] = [];
      for (const node of messages) {
        edges.push({
          node: node,
          cursor: node.id
        });
      }
      // return messages;
      return {
        pageInfo: {
            hasNextPage: false,
            hasPreviousPage: false
        },
        edges: edges,
        aggregate: {
          count: () => {
            // Resolve count only
            return 123;
          }
        }
      };
   }
}

Так что, если я вручную определю преобразователь, как это, он будет работать.

AggregateMessage: {
    count(parent: any, args: any, context: any, info: any) {
      return parent.count();
      // Default resolver normally returns parent.count
      // I want it to return parent.count() by default
    }
}

Но если я удалю определение и буду использовать разрешение по умолчаниюфункциональность не работает.

Я ожидаю, что она вызовет функцию parent.count () согласно пункту # 2 в документации, если я удалю ручной распознаватель и буду полагаться на поведение распознавателя по умолчанию для вызова функции наназвание объекта.

Вызывает функцию в obj с соответствующим именем поля и передает аргументы запроса в эту функцию.

Однако это выдает ошибку типа, поскольку "count" определяется как тип Int, ноэто на самом деле функция.Как я могу сделать это правильно, чтобы была вызвана функция count и возвращено значение при разрешении, без необходимости самостоятельно определять преобразователь?

Int cannot represent non-integer value: [function count]

1 Ответ

0 голосов
/ 09 февраля 2019

Проблема возникает из-за mergeSchemas из graphql-tools.

При передаче распознавателей в mergeSchemas (вместо apollo-server или makeExecutableSchema) функция распознавателя по умолчанию для функций не работает должным образом.

https://github.com/apollographql/graphql-tools/issues/1061

Я не уверен, предназначена ли эта функция, но перемещение преобразователей в вызов makeExecutableSchema устранило проблему.

...