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

GraphQL 命名对象字面量 typeDef

如何解决GraphQL 命名对象字面量 typeDef

我正在完成一个个人项目,我正在尝试找出在 GraphQL 的类型定义中定义一个 Object of Objects 的最佳方法

{
    "2020-12-29": {
    open: true,hours: 2,appointments: {
        "09:00-am": {
            appointmentId: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",userName: "Shaun Cartwright glover",email: "Maverick.Quitzon31@yahoo.com",phoneNumber: "1-401-519-4771",avatar: "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/128.jpg",},totalAppointments: 1,

如您所见,顶级日程表的对象字面量的名称是日期,每个单独的约会也是如此。如果有帮助,我也在使用 graphql 棱镜。

解决方法

为了跟随您的示例,让我们将您的对象文字分解为它所代表的实体。在高级细节中,您正在查看

  • 代表约会的实体
  • 与上述约会相关的用户
  • 与特定约会时间相关联的约会列表
  • 给定日期的约会时间列表
  • 日期列表,以时间表的形式

对我来说,这似乎与您拥有的示例中的数据非常(但不完全)匹配。基于此,我在下面定义了一个架构,其中包含一些与您的建议略有不同的有意设计决策。

让我们定义一些类型,并将它们组合在一起,从 User 类型开始:

type User {
  id: ID!
  name: String!
  email: String!
  # Depending on your requirements,a user may not have to provide a phone number.
  phoneNumber: String
  # Depending on your requirements,a user may not have an Avatar.
  avatarUrl: String
}
type Appointment {
  id: ID!
  user: User!
}
type AppointmentTime {
  time: String!
  appointments: [Appointment!]!
}
type Day {
  # The Day ID could be the actual day itself,i.e. 2020-12-29
  id: ID!
  open: Boolean!
  hours: Int!
  appointmentTimes: AppointmentTime!
}
type Schedule {
 days: [Day!]!
}

这将允许您编写这样的查询(假设您有一个 getSchedule 查询 -- 或类似效果的查询):

getSchedule {
  days {
    id
    open
    hours
    appointmentTimes {
      time
      appointments {
        id
        user {
          name
          email
          phoneNumber
          avatarUrl
        }
      }
    }
  }
}
{
  days: [
    {
      id: "2020-12-29",open: true,hours: 2,appointmentTimes: [
        {
          time: "09:00-am",appointments: [
            {
              id: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",user: {
                name: "John Smith",email: "john@smith.com",phoneNumber: "123...",avatarUrl: "...",}
            },...
          ]
        },...
      ]
    },...
  ]
}

请注意,这最终会产生与您发布的输出略有不同的输出。为什么?

好吧,我做出了以下设计选择,我鼓励您也进行调查:

  1. 用户应该是一个单独的字段。在您的示例中,用户和约会信息都在同一个键下 - 09:00-am - 在这里,我们希望利用 GraphQL 的类型系统通过定义一个 User 类型来规范化架构,我们可以附加到约会。也更适合内省。

  2. 您的 appointments 键指向另一个对象作为它的值,而不是一个列表。由于您要在一天结束时返回约会列表,因此您应该将其建模为 GraphQL List

  3. 添加了与约会列表关联的 AppointmentTime 类型。这允许您同时进行多个约会。 (未来证明)

  4. 每天都有一个 AppointmentTime 列表 --- 这是最佳的,因为您现在不再依赖于键(在您的情况下为 09:00-am)来定义关联的数据每个约会时间。 (未来证明)

如果您确实希望对象文字与 graphql 输出完全匹配,您可以将我选择提取的某些字段内联到其他类型,但实际上,您应该为此利用列表那种东西。

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