如何将对象传递给阿波罗graphql的突变

时间:2020-06-03 21:17:43

标签: reactjs graphql apollo-client

我尝试在react项目中将变量传递给我的突变。它是有效静态代码:

const EDIT_WORD = gql`
  mutation {
    editWord(
      eng_word: "apple"
      data: { eng_word: "apple1", ru_word: "яблоко1" }
    ) {
      eng_word
    }
  }
...
const [editWordHook] = useMutation(EDIT_WORD);
...
editWordHook();

这是有一些错误的代码:

const EDIT_WORD = gql`
  mutation($eng_word: String!, $data: wordInput!) {
    editWord(
      eng_word: $eng_word
      data: { eng_word: $eng_word, ru_word: $ru_word }
    ) {
      eng_word
    }
  }
  `;
...
const [editWordHook] = useMutation(EDIT_WORD);
...
editWordHook({
        variables: {
          eng_word: editedWord,
          data: {
            eng_word: englishWordText,
            ru_word: russianWordText,
          },
        },
      });

我尝试了

而不是[$ data:wordInput!]
$data: { $eng_word: String!, $ru_word: String! }

但是没有帮助...错误日志没有提供任何有价值的信息:

// value or the constructed error will be meaningless.
> 46 | constructor({
     | ^  47 |   graphQLErrors,
  48 |   networkError,
  49 |   errorMessage,

已经用了10个小时,找不到错误...

4 个答案:

答案 0 :(得分:1)

感谢所有尝试帮助我的人!我放弃了,将架构更改为更丑的版本...

editWord(
    edited_eng_word: String!
    new_eng_word: String!
    new_ru_word: String!
  ): Word!

现在,它不需要对象并且可以工作。 ...我讨厌graphQl

答案 1 :(得分:1)

我和你有同样的问题。 我找到了解决方法。

const EDIT_WORD = gql`
  mutation($eng_word: String!, $data: wordInput!) {
    editWord(
      eng_word: $eng_word,
      data: $data
    ) {
      eng_word
    }
  }
`;

您可能必须这样做。 并调用此突变时,请执行以下操作:

editWord({
    variables: {
        eng_word: 'XXX'
        data: {
            eng_word: "YYY",
            ru_word: "ZZZ",
        }
    }
}).then(
).catch(
)

希望这对您有帮助

答案 2 :(得分:0)

您传递变量

      { eng_word: editedWord,
              data: {
                eng_word: englishWordText,
                ru_word: russianWordText,
              }
       }

进入您的editWordHook函数,但是您的EDIT_WORD突变却没想到。

const EDIT_WORD = gql`
  mutation($eng_word: String!, $data: wordInput!) {
    editWord(
      eng_word: $eng_word
      data: { eng_word: $eng_word, ru_word: $ru_word }
    ) {
      eng_word
    }
  }
  `;

您的EDIT_WORD突变没有必需的参数

const EDIT_WORD = gql`
  mutation($eng_word: String!, $data: wordInput!) {
    editWord(
      eng_word: $eng_word
      data: { eng_word: $eng_word, ru_word: $ru_word }
    ) {
      eng_word
    }
  }
  `;

如您所见,变异输入参数为$eng_word: String!$data: wordInput!,但您在其中使用了$ru_word

如果您的data变量对应于wordInput!类型,请尝试使用整个数据对象进行突变

const EDIT_WORD = gql`
  mutation($eng_word: String!, $data: wordInput!) {
    editWord(
      eng_word: $eng_word
      data: $data
    ) {
      eng_word
    }
  }
  `;

答案 3 :(得分:-1)

这是一个当您想将对象作为变量传递时的变更请求示例

const CREATE_GAME = gql`
      mutation createGame($game: CreateGameInput!) {
        createGame(input: $game) {
          name
        }
      }
    `;


const [createGameDB] = useMutation(CREATE_GAME);
await createGameDB({ variables: {game: preparedGameToDb}})

CreateGameInput 它是您在服务器上定义的输入。就我而言,它看起来像那样

@InputType()
export class CreateGameInput {    
        @Field(() => String)
        name: String;
        @Field(type => [TeamInput], { nullable: true })
        teams: TeamInput[];
        @Field(type => [MemberInput], { nullable: true })
        members: MemberInput[]
        @Field(type => [GameWordInput], { nullable: true })
        words: GameWordInput[];
}