0

GraphQL 中的标准做法之一是使用 ID 标量作为任何记录的全局 ID。这是有道理的,但让我想知道如何最好地确保客户端在参数或突变中使用“正确”的 id,或者知道使用哪一个。

query {
 Books(id: ID) {
  id: ID!
  name: Text!
  pages: Int!
  }
 DVDs(id: ID) {
  id: ID!
  name: Text!
  }
}
mutations {
  removePageFromBook(id ID) {
    sadBook: Book!
  }
}

使用上面的模式,很明显我们不想removePageFromBook使用代表 DVD 的 ID 来调用,而只需要使用代表 Book 的 ID 来调用。

然而问题在于,这只是因为命名而变得清晰,这是在大多数其他 GraphQL 场景中可以避免的,并且与它的精神背道而驰。特别是当模式变大时,这变得越来越难以有效沟通。

那么有没有什么好的方法来处理这个问题呢?(如果有人试图从 DVD 中删除页面,最好返回 null 或错误)

(在我们目前的情况下,我们知道服务器上的 ID 'really' 代表什么类型 ala base64("book:123")

4

2 回答 2

0

如果我正确理解您的问题,答案是(可悲)否。这实际上是泛型的一个很好的用例,但该提议目前已被搁置。

于 2021-01-05T14:57:54.940 回答
0

GraphQL 中的标准做法之一是使用 ID 标量作为任何记录的全局 ID。

Global这里不是一个好的假设。通常,它是一个类型相关的 id。不是全球性的,不是唯一的。

(在我们目前的情况下,我们知道服务器上的 ID 'really' 代表什么类型 ala base64("book:123") )

...然后它是 [物化] 实现的一部分 ...并且您已经拥有唯一的 AND 类型相关的 id

...在您的removePageFromBook突变解析器中,您知道您应该使用 [in db/sql query] anidbooktype 构造并且args.id... 仅影响 [/work on] booktypes[/records] ...没有风险此处不匹配...因为您不能影响不相关的其他记录[/types]

... 使用存储库/ORM/其他 DB 抽象层,您可以在幕后使用它 [类型+id 匹配]

WPGraphQL(WordPress 插件)为从 type 派生的自定义帖子类型 [fe] 实现了一个稍微不同的解决方案Postposts存储在表中的帖子具有id[DB 字段],每个表唯一 [autoincrement] 但与派生的 [any] 类型无关,因为它只是 int(用于 DB 关系)。默认情况下,WPGraphQL公开一个全局唯一类型相关属性,对所有可能的类型/表都是唯一的,而不是仅发布派生类型。它在内部解析为 DB [int]并用于类型匹配(如果突变输入类型必须与特定的 CPT 相关,则为 fe)。或者,您可以使用“人类可读” ......现在(新版本)您可以使用plus enum ( , , , )。ididdatabaseIdididTypeDATABASE_IDIDURISLUG

结论

您可以使用与idGraphQL API 级别相关的全局唯一类型,并使用真实或虚拟数据和元数据以任何您需要的方式在内部实现它。这完全取决于您的堆栈/层/库。

更新

更FE和更通用的问题......再次使用WPGraphQL......所有突变都有自己的输入和结果/有效负载类型,例如createComment(input: CreateCommentInput!): CreateCommentPayload

...但是,这并不能防止id仅...的不匹配使用

...但可以帮助何时removePageFromBookInput包含一些[特定于书籍]pageToRemove

于 2021-01-06T00:09:47.543 回答