gpt4 book ai didi

graphql - 我可以向 GraphQL 边缘添加数据吗?

转载 作者:行者123 更新时间:2023-12-04 02:51:05 26 4
gpt4 key购买 nike

我在玩 GraphQL,并且遇到了连接和边缘的概念。

据我了解,在连接上看到元数据的情况并不少见,例如 totalCount以下代码段中的属性。

type UserFriendsConnection {
pageInfo: PageInfo!
edges: [UserFriendsEdge]
totalCount: Int
}

我的问题是是否可以将任意元数据也放在边缘,以及以下是否是一种体面的方式来做到这一点。

我觉得查询和回复最能说明我在寻找什么。这是 role我想把属性(property)放在有意义的地方。

我觉得它不属于 User type 因为角色描述了连接/关系的类型 User有一个 Group .
# Query

{
me {
id
name
groupsConnection {
edges {
node {
id
name
membersConnection {
edges {
node {
id
name
}
role <--- HERE
}
}
}
role <--- HERE
}
}
}
}
# Response

{
"data": {
"me": {
"id": "1Edj3hZFg",
"name": "John Doe",
"groupsConnection": {
"edges": [
{
"node": {
"id": "bpQgdZweQE",
"name": "Fishing Team",
"membersConnection": {
"edges": [
{
"node": {
"id": "1Edj3hZFg",
"name": "John Doe"
},
"role": "ADMINISTRATOR" <--- HERE
},
{
"node": {
"id": "7dj37dH2d",
"name": "Rebecca Anderson"
},
"role": "MEMBER" <--- HERE
}
]
}
},
"role": "ADMINISTRATOR" <--- HERE
}
]
}
}
}
}

最佳答案

连接是 Relay specification 的一部分. Relay 本身是一个 GraphQL 客户端,尽管您可以拥有一个兼容 Relay 的 GraphQL 服务器,而无需在前端实际使用 Relay。根据规范:

Edge types must have fields named node and cursor. They may have additional fields related to the edge, as the schema designer sees fit.



在这些类型上看到额外的字段是很常见的,这当然是有道理的。不过要提醒一句。如果我们有一个 User类型,我们可以创建一个 UserConnection和一个 UserEdge :
type UserConnection {
pageInfo: PageInfo!
egdes: [UserEdge!]!
}

type UserEdge {
cursor: String!
edge: User!
}

然后我们可以在各种地方使用该连接类型......
type Query {
allUsers: UserConnection!
# other fields
}

type Group {
members: UserConnection!
# other fields
}

type User {
coworkers: UserConnection!
# other fields
}

但是,如果您添加类似 role 的字段至 UserEdge ,该字段仅在 members 的上下文中才有意义场上 Group类型。它必须在所有其他上下文中返回 null 或一些虚拟值,这可能会引入不必要的混淆。

这意味着,如果您要在关系相关的边缘类型上引入额外的字段,您可能应该创建特定于该关系的连接和边缘类型:
type GroupUserConnection {
pageInfo: PageInfo!
egdes: [GroupUserEdge!]!
}

type GroupUserEdge {
cursor: String!
edge: User!
role: Role!
}

这样,您仍然可以使用常规 UserConnection用于其他字段并避免客户端不必要地请求 role没有的地方。

关于graphql - 我可以向 GraphQL 边缘添加数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54947891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com