突变中的 GraphQL 嵌套节点 - 对象文字只能指定已知属性,并且类型中不存在“天”

Posted

技术标签:

【中文标题】突变中的 GraphQL 嵌套节点 - 对象文字只能指定已知属性,并且类型中不存在“天”【英文标题】:GraphQL nested nodes in mutation - Object literal may only specify known properties, and 'days' does not exist in type 【发布时间】:2021-05-23 01:30:07 【问题描述】:

我的架构的一般结构是这样的:

一个例程可以有好几天。 一天可以进行多次练习。

我有一个由 AWS Amplify CLI 生成的 GraphQL 突变。

突变看起来像这样:

export const createRoutine = /* GraphQL */ `
  mutation CreateRoutine(
    $input: CreateRoutineInput!
    $condition: ModelRoutineConditionInput
  ) 
    createRoutine(input: $input, condition: $condition) 
      id
      name
      description
      days 
        items 
          id
          routineID
          name
          description
          exercises 
            items 
              id
              dayID
              name
              description
              reps
              sets
            
          
        
      
    
  
`;

当我像这样进行 GraphQL 突变时:

const inp = 
      id: id,
      name: "Test Routine Dynamic",
      description: "Description for TRD",
      days: 
        items: 
          id: id,
          routineID: id,
          name: "Day 1 of TRD",
          description: "Description for Day 1 of TRD",
          exercises: 
            items: 
              id: id,
              dayID: id,
              name: "Bench Press",
              description: "Push the bar",
              reps: "3",
              sets: "5",
            ,
          ,
        ,
      ,

我的 IDE 收到一条错误消息: 对象字面量只能指定已知属性,类型中不存在'days'

因为输入的类型是CreateRoutineInput,看起来像这样:

export type CreateRoutineInput = 
  id?: string | null,
  name: string,
  description?: string | null,
;

为什么生成的 CreateRoutineInput 类型不允许我指定嵌套项“Days”? 我对 GraphQL 有点陌生,所以也许这是不应该做的事情。

非常感谢任何帮助,谢谢。

【问题讨论】:

【参考方案1】:

好吧,我想我找到了解决方案,希望将来如果有人偶然发现这个线程,这可能会有所帮助:

问题实际上是我的架构。我设置它的方式是每个“对象”都是一个@model。我认为这实际上意味着他们都有自己的身份验证规则和自己的表格。不过,这不是 100% 确定的!

我实际上并不真的需要将它们分开那么多,因为它们都是在等级上相互关联的。

所以我的架构之前看起来像这样:

type Routine
  @model
  @auth(...) 
  id: ID!
  name: String!
  description: String
  days: [Day]! @connection(keyName: "byRoutine", fields: ["id"])


# day = post
type Day
  @model
  @key(name: "byRoutine", fields: ["routineID"])
  @auth(...) 
  id: ID!
  routineID: ID!
  name: String
  description: String
  exercises: [Exercise] @connection(keyName: "byDay", fields: ["id"])


type Exercise
  @model
  @key(name: "byDay", fields: ["dayID"])
  @auth(...) 
  id: ID!
  dayID: ID!
  name: String!
  description: String
  reps: String!
  sets: String!


如您所见,它们都标有@model。 因此,经过许多其他尝试,我只是从嵌套类型中删除了所有标签,并将它们设为类型。然后它们被简单地用作父类型的字段的类型。

所以现在看起来像这样:

type Routine
  @model
  @auth(...) 
  id: ID!
  name: String!
  description: String
  days: [Day]!


type Day 
  id: ID!
  routineID: ID!
  name: String
  description: String
  exercises: [Exercise]


type Exercise 
  id: ID!
  dayID: ID!
  name: String!
  description: String
  reps: String!
  sets: String!

而且它有效!现在我可以创建嵌套突变。现在看起来像这样:

如果您遇到困难,希望这对您有所帮助!当我修复它时,这让我松了一口气。

【讨论】:

以上是关于突变中的 GraphQL 嵌套节点 - 对象文字只能指定已知属性,并且类型中不存在“天”的主要内容,如果未能解决你的问题,请参考以下文章

突变中的嵌套对象

如何使用 Django 嵌套对象添加 GraphQL 突变?

嵌套对象的 Hasura GraphQL UPSERT 突变

突变中的 GraphQL 嵌套数据

带有嵌套突变的 Graphql?

带有嵌套突变的 Graphql?