Объект как входная переменная в мутации: GraphQL - Apollo - React - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть клиентский проект React и API Node.js / GraphQL в двух отдельных репозиториях.

В моем приложении React я хочу передать объект как тип переменной в свою мутацию. Вот как выглядит моя мутация:

export const CREATE_SPEAKER = gql`

  input Expertise {
    title: String!
    domain: String!
  }

  mutation CreateSpeaker(
    $name: String!
    $age: String!
    $nationality: String!
    $avatar: String!
    $expertise: Expertise!
  ) {
    createSpeaker(
      speakerInput: {
        name: $name
        age: $age
        nationality: $nationality
        avatar: $avatar
        expertise: $expertise
      }
    ) {
      name
      age
      nationality
      avatar
      expertise {
        title
        domain
      }
    }
  }
`;

В моем проекте Node.js у меня есть следующая схема:

input SpeakerInput {
      name: String!
      age: String!
      expertise: ExpertiseInput!
      nationality: String!
      avatar: String
}

input ExpertiseInput {
      title: String!
      domain: String!
}

И мой преобразователь:

createSpeaker: async args => {
    const { name, age, nationality, avatar, expertise } = args.speakerInput;

    const newSpeaker = new Speaker({
      name,
      age,
      nationality,
      avatar,
      expertise: {
        title: expertise.title,
        domain: expertise.domain
      }
    });

    try {
      return await newSpeaker.save();
    } catch (error) {
      throw ("Failed to create speaker:: ", error);
    }
}

Но я получаю следующее сообщение об ошибке при попытке создать динамик:

Uncaught (в обещании) Инвариантное нарушение: определения типа схемы не допускаются в запросах. Найдено: "InputObjectTypeDefinition"

Есть предложения / идеи, как это сделать?

1 Ответ

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

Вы не можете определить дополнительные типы при отправке запросов в службу GraphQL, и вам не нужно - просто используйте типы, которые вы уже определили на сервере (в данном случае ExpertiseInput:

$expertise: ExpertiseInput!

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

mutation CreateSpeaker($input: SpeakerInput!) {
  createSpeaker(speakerInput: $input) {
    name
    age
    nationality
    avatar
    expertise {
      title
      domain
    }
  }
}
...