【问题标题】:How to pass Object to mutation of apollo graphql如何将对象传递给 apollo graphql 的突变
【发布时间】:2020-09-22 17:51:36
【问题描述】:

我尝试将变量传递给我在反应项目中的突变。它是工作静态代码:

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 个小时,找不到错误...

【问题讨论】:

  • 有时会发生这种情况,您能否将查询粘贴到 Playground 并在确保它在那里工作后尝试将其粘贴回代码部分?你也用prettier?
  • 是的,我在操场上通过了这个查询,它在那里工作......我用的更漂亮,但可能我没有 gql 的扩展
  • 其实你可以尝试安装,有时我也出现过。如果它不漂亮,我就知道有问题。有时它可能是由空的垫片引起的。
  • 你传递了正确的变量(eng_word,data - API 需要,可由 graphiql 文档探索)但使用了错误的查询,这足以 editWord( eng_word: $eng_word data: $data ) ..... 在编码之前学习在graphiql中使用“查询变量”

标签: reactjs graphql apollo-client


【解决方案1】:

感谢所有试图帮助我的人!我放弃并将架构更改为更丑陋的版本...

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

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

【讨论】:

    【解决方案2】:

    你传递变量

          { 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
        }
      }
      `;
    

    【讨论】:

    • 我试过 const EDIT_WORD = gql` mutation($eng_word: String!, $data: { $eng_word: String!, $ru_word: String!} ) { editWord( eng_word: $eng_word data: { eng_word: $eng_word, ru_word: $ru_word } ) { eng_word } } `;但它也不起作用
    • 或者也试过 const EDIT_WORD = gql` mutation($eng_word: String!, $ru_word: String!) { editWord( eng_word: $eng_word data: { eng_word: $eng_word, ru_word: $ru_word } ) { eng_word } } `;没用……
    • 你们俩都忘记了逗号,就在$eng_word 之后,@NikitaPolevoy 我认为如果您输入$eng_word, data,那么您在 cmets 中的第二次尝试应该会奏效
    • 我尝试了数百万个选项,但没有...我放弃并更改了架构:-(
    【解决方案3】:

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

    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(
    )
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

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

      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[];
      }
      

      【讨论】:

      • 关于 apollo 客户端的问题,而不是服务器 ... API 已经使用(对象接受)输入类型 - wordInput
      猜你喜欢
      • 2018-07-15
      • 2020-05-05
      • 2017-02-07
      • 2017-12-12
      • 2019-10-31
      • 2017-08-22
      • 2020-02-03
      • 2017-01-26
      • 2020-11-12
      相关资源
      最近更新 更多