graphql: необходимо предоставить исходный код. Получено: {kind: "Document, definition}

Я действительно новичок в Graphql (на самом деле, только вчера). Я «играю» и пробую различные инструменты экосистемы (apollo-server, graphql.js ... и т. Д.).

Ради экспериментов я пытаюсь вызвать запрос из nodejs (а не от клиента в браузере, такого как приложение реакции)

Прежде всего, это моя простая схема вместе с резолверами:

export const mySchema = gql`
   type User {
      id: ID!
      name:  
      surname: String
   }

   # root query has been defined in another file
   extend type Query {
      users: [User]
      test: [User]
   }
` 
export const myResolvers = {
   users: () => [ __array_of_users__ ],
   test: () => /* this is where I would like to re-invoke the 'users query'
}

Используя функцию makeExecutableSchema, я создаю объект schema с моими типами и распознавателями и экспортирую эту схему в серверное приложение apollo. Пока все работает нормально.

Теперь, следуя этому предложенному решению stackoverflow, я создал вспомогательную функцию, которая должна позвольте мне вызвать запрос, определенный в моей схеме, следующим образом:

import { graphql } from "graphql";
import { schema } from "./my-schema";

export const execute = str => {
  return graphql(schema, str );
};

С помощью этой вспомогательной функции мои преобразователи становятся:

import { gql } from "apollo-server-express";
import { execute } from '__path_to_helper_function__';

export const myResolvers = {
  users: () => [ __array_of_users__ ],
  test:  () => execute( gql`
     query users {
           name
      }    
  `)
}

Но на детской площадке, когда я пытаюсь выполнить запрос:

   {
      test {
        name
      }
   }

Я получаю следующую ошибку:

введите здесь описание изображения

Я даже не знаю, можно ли сделать то, что я пытаюсь сделать (вызвать запрос из узла). Любое предложение будет принято с благодарностью.

Thnaks


person TheSoul    schedule 16.06.2019    source источник


Ответы (1)


graphql-tag берет строку и преобразует ее в объект DocumentNode. Фактически это то же самое, что и передача String функции parse. Некоторые функции, экспортируемые модулем graphql, например execute, ожидают передачи в объекте DocumentNode, а функция graphql - нет. Как видно из подписи, в качестве запроса следует передать просто строку String:

graphql(
  schema: GraphQLSchema,
  requestString: string,
  rootValue?: ?any,
  contextValue?: ?any,
  variableValues?: ?{[key: string]: any},
  operationName?: ?string
): Promise<GraphQLResult>

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

person Daniel Rearden    schedule 16.06.2019
comment
Спасибо за Ваш ответ. Я удалил 'gql', как было предложено, и передал строку: 'query users {name}'. Теперь я получаю сообщение об ошибке: не удается запросить имя поля для типа Query. Что могла означать эта ошибка? - person TheSoul; 17.06.2019
comment
Вы запрашиваете поле name в корневом типе запроса, которого не существует. Предположительно вы имели в виду query { users { name } }. Первый по-прежнему работает, потому что users рассматривается просто как имя операции. - person Daniel Rearden; 17.06.2019
comment
Я попробовал ваше предложение query { users { name } }, к сожалению, получаю ту же ошибку ... - person TheSoul; 18.06.2019
comment
@TheSoul Вы получаете ту же ошибку, что и раньше? Cannot query field "name" on type "Query" - person Daniel Rearden; 18.06.2019
comment
В любом случае, это, вероятно, должен быть отдельный вопрос со всем соответствующим кодом. Ошибка, которую вы видите, не связана с вашей исходной проблемой. - person Daniel Rearden; 18.06.2019