微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

我有一个由 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 有点陌生,所以也许这是不应该做的事情。

非常感谢您的帮助,谢谢。

解决方法

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

问题实际上是我的架构。我设置它的方式是每个“对象”都是一个@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!
}

它有效!现在我可以创建嵌套的突变。现在看起来像这样: Amplify Console API Mutation

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。