当前位置: 首页 > 知识库问答 >
问题:

GraphQL 突变中的嵌套数据

秦浩漫
2023-03-14

我在GraphQL中遇到了一些困难,其中模式中的类型包括嵌套类型。所以假设我有一个预订的数据类型:

const BookingType = new GraphQLObjectType({
    name: 'Booking',
    fields: () => ({
        id: { type: GraphQLInt },
        Date: { type: GraphQLString },
        Venue: { type: GraphQLString }
    })
});

在模式文件中,我还有一个如下所示的根变异:

createBooking: {
  type: BookingType,
  args: {
    Date: { type: new GraphQLNonNull(GraphQLString) },
    Venue: { type: new GraphQLNonNull(GraphQLString) }
  },
  resolve(parentValue, args){
    return axios.post('http://localhost:3000/booking', args)
      .then(resp => resp.data);             
  }
}

我可以在 GraphiQL 中编写一个突变来为预订创建数据,没问题:

mutation {
  createBooking(
    Date: "2018-03-12",
    Venue: "Some place",
  ) {
    id
    Date
    Venue
  }
}

到目前为止一切都很好。现在,我需要向原始预订对象添加一个嵌套类型来记录分配给预订的工作人员。因此,我为工作人员添加了类型(输入和输出类型),并将这些类型添加到预订类型和突变中:

// output type
const AssignedStaffType = new GraphQLObjectType({
    name: 'AssignedStaff',
    fields: () => ({
        id: { type: GraphQLInt },
        Name: { type: GraphQLString }
    })
});

// input type
const AssignedStaffInputType = new GraphQLInputObjectType({
    name: 'AssignedStaffInput',
    fields: () => ({
        id: { type: GraphQLInt },
        Name: { type: GraphQLString }
    })
});

预订类型变为:

const BookingType = new GraphQLObjectType({
    name: 'Booking',
    fields: () => ({
        id: { type: GraphQLInt },
        Date: { type: GraphQLString },
        Venue: { type: GraphQLString },
        Staff: { type: new GraphQLList(AssignedStaffType) }
    })
});

根突变变成了:

createBooking: {
  type: BookingType,
  args: {
    Date: { type: new GraphQLNonNull(GraphQLString) },
    Venue: { type: new GraphQLNonNull(GraphQLString) },
    Staff: { type: new GraphQLList(AssignedStaffInputType) }
  },
  resolve(parentValue, args){
    return axios.post('http://localhost:3000/booking', args)
      .then(resp => resp.data);             
  }
}

我不知道的是,现在如何在GraphiQL中公式化突变,特别是使用什么作为Staff的值:

mutation {
  createBooking(
    Date: "2018-03-14",
    Venue: "Some place",
    Staff: // ??? <--- What goes here??
  ) {
    id
    Venue
    Date
    Staff
  }
}

我尝试给它一个对象或具有与AssignedStaffInpuType相同结构的对象数组,但我只是得到一个错误(“期望AssignedStaffInpuType”)。客户端(在本例中为GraphiQL)对架构中定义的AssignedStaffInpuType一无所知,因此我不明白a)如何在客户端中使用此输入类型,或者b)如何使用所需数据填充此类类型。

救命求你了!

共有1个答案

林烨烨
2023-03-14

没关系,我想通了。事实上,我可以以正确的格式(在模式中的输入类型中指定)传递对象(或对象数组),而且效果很好。我遇到问题的原因是,输入类型中的一个字段的标量类型错误,这导致了错误。客户端似乎不需要知道模式中指定的类型。因此,上述有问题的突变事实上应该这样写:

mutation {
  createBooking(
    Date: "2018-03-14",
    Venue: "Some place",
    Staff: [{staffId: 1}]
  ) {
    id
    Venue
    Date
    Staff{
       Name
    }
  }
}
 类似资料:
  • 我正在使用Apollo服务器,试图为一个电子商务应用程序构造一个嵌套查询。我正在查询一个rest api以检索购物篮中的物品。 然而,此请求的响应并不包含我们需要的所有产品信息。因此,我尝试嵌套一个附加查询,使用返回的参数之一作为变量,以获得所需的附加产品信息。 我已经看到了嵌套查询示例,据我所知(我对GraphQL和Apollo尤其陌生),这是GraphQL的一大优点。但是我还没有看到任何嵌套查

  • 数据布局如下所示: 根据我的理解,我的解析器应该是这样的:第一个解析食谱,第二个解析食谱中的成分字段。它可以(根据我的理解)使用食谱提供的论点。在我的recipe对象中,id(int)引用了成分,所以这应该是参数(至少我是这么认为的)。 这些解析器像这样传递给应用程序: 如何在Express-GraphQL中为嵌套类型编写分离解析器?

  • 我的变异查询: 查询变量: GraphQL模式(突变定义): 我尝试同时使用GraphiQL接口和apollo-client来发送带有变量的请求,但出现了相同的错误。有什么想法吗?

  • 和相应的查询解析器 这里的主要想法只是有一个过滤器,可以看到什么食谱有一些成分,用户会通过应用程序通知。 我使用数据库中的所有食谱获得了“recipe”查询,但我需要一个获取这些食谱的查询,然后使用field comprient进行筛选,例如: 食谱-糖蛋糕,配料:糖、蜂蜜、四个… 配方-天鹅绒蛋糕,配料:糖、香草、... 并且用户通知Sugar,API应该返回这2个食谱,但是如果用户通知Suga

  • 我正在尝试向使用Apollo的GraphQL服务器发送突变查询。 然而,我只看到实现这一点的唯一方法是使用突变组件。https://www.apollographql.com/docs/react/essentials/mutations/#the-突变成分 有没有一种简单的方法可以发送这样的突变? 从“graphql标记”导入gql;

  • 问题内容: 有没有比抛出异常更简单的方法来摆脱嵌套循环?(在Perl中,您可以给每个循环加上标签,至少可以继续一个外部循环。) 即,有没有比以下更好的方法: 问题答案: 至少有人建议,但也拒绝了。我认为没有其他方法,只需重复测试或重新组织代码即可。有时有点烦人。 范·罗瑟姆(van Rossum)先生在拒绝消息中提到使用,这确实很明智,我需要个人记住这一点。:)