对象作为突变中的输入变量:GraphQL - Apollo - React

Posted

技术标签:

【中文标题】对象作为突变中的输入变量:GraphQL - Apollo - React【英文标题】:Object as input variable in mutation: GraphQL - Apollo - React 【发布时间】:2020-05-18 12:44:57 【问题描述】:

我在两个独立的 repo 中有一个 React 客户端项目和一个 Node.js/GraphQL api。

在我的 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);
    

但我在尝试创建扬声器时遇到以下错误:

未捕获(承诺)不变违规:架构类型定义不 允许在查询中。找到:“InputObjectTypeDefinition”

任何建议/想法如何做到这一点?

【问题讨论】:

【参考方案1】:

在向 GraphQL 服务发送请求时,您无法定义其他类型,也不需要 - 只需使用您已经在服务器上定义的类型(在本例中为 ExpertiseInput

$expertise: ExpertiseInput!

但是,一开始就没有必要使用这么多变量:

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

【讨论】:

以上是关于对象作为突变中的输入变量:GraphQL - Apollo - React的主要内容,如果未能解决你的问题,请参考以下文章

在 graphQL 中提交对象数组作为查询变量

GraphQL 突变、参数/变量对象(带点符号)

使用输入对象的graphql突变

应该如何对列表中的项目进行重新排序,并更新多个对象,如何使用 GraphQL 突变进行持久化?

如何将具有多个对象的状态数组作为参数传递给graphql突变?

如何在突变 graphQL Playground 中传递变量?