2

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

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

我有一个由 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 中收到一条错误消息: 对象文字可能只指定已知属性,并且类型中不存在“天数”

因为输入的类型CreateRoutineInput如下所示:

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

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

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

4

1 回答 1

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!
}

它有效!现在我可以创建嵌套突变。现在看起来像这样: 放大控制台 API 突变

如果您遇到困难,希望这对您有所帮助!当我修复它时,这对我来说是一个很大的解脱。

于 2021-02-20T12:38:46.123 回答