如何在 AppSync GraphQL 架构中使用自定义输入类型?
Posted
技术标签:
【中文标题】如何在 AppSync GraphQL 架构中使用自定义输入类型?【英文标题】:How to use custom input types in AppSync GraphQL schema? 【发布时间】:2021-03-10 09:55:32 【问题描述】:我正在试验 AppSync + DynamoDB。我想在我的 GraphQL Schema 中有以下类型:
type User
user_id: String!
type Box
name: String!
user: User!
如何在 DynamoDB 中创建一个存储指向另一个表的项目的表(在我的情况下,我希望表 BoxTable
的字段 user
成为表 UserTable
中用户的引用?
如何在 AppSync 中定义上述架构?当我设置user: User!
时,我收到错误Expected User! to be a GraphQL input type.
?
【问题讨论】:
【参考方案1】:根据我对您问题的理解,这些是我的答案。
如何在 DynamoDB 中创建一个表来存储指向另一个表的项目
DynamoDB 不是关系数据库,不提供外键或表连接。因此,要实现您在帖子中提到的内容,您仍然需要两次调用 DynamoDB 来获取 Box
的所有信息,即首先从 BoxTable
获取 Box
项目,然后从 @ 获取 user
987654325@ 基于user_id
。如果您的用例是您首先获得user
,那么您可以使用user_id
的过滤器获得Box
。
现在到您帖子的第二部分,
如何在 AppSync 中定义上述架构?
使用 DynamoDB 单元解析器,您可以查询单个表(在 DynamoDB 批量操作之外,但这些是为批量用例保留的)。
这样做的一种方法是定义应该看起来像这样的架构;
type User
user_id: String!
type Box
name: String!
user: User!
input BoxInput
name: String!
user: UserInput!
input UserInput
user_id: String!
type Mutation
createBox(input: BoxInput): Box
type Query
getBox(input: BoxInput): Box
这就是您可以运行查询和变异的方式;
mutation createBox
createBox(input:
name: "abc"
user: user_id: "1234-abcd-5678-efgh"
)
name
user user_id
query getBox
getBox(input:
name: "abc"
user: user_id: "1234-abcd-5678-efgh"
)
name
user user_id
因此,请注意上述查询和变异。这些会将user
显示为空,除非您在Box
类型中附加一个单独的解析器与user
类型。例如:
Query that returns Box --> Resolver
type Box
name
user --> Attach resolver to get user_id from your UserTable
另一种方法是利用管道解析器,您可以在其中创建多个函数,每个函数都可以使用前一个函数的结果并查询数据库。这些函数按照您指定的顺序运行。例如:
-
从
BoxTable
获取Box
的函数。
通过使用来自ctx.prev.result
的user_id
从UserTable
获取user
的函数。
最后根据架构中的 Box
类型将上述两个结果合并为一个 JSON 对象。
【讨论】:
以上是关于如何在 AppSync GraphQL 架构中使用自定义输入类型?的主要内容,如果未能解决你的问题,请参考以下文章
在将 aws cdk 与 appsync 一起使用时,如何将突变添加到 graphql 架构并防止部署失败?
如何在 Graphql 架构级别检查 AWS AppSync OIDC 指令的角色或权限
如何在 AWS AppSync GraphQL 架构上处理多个 @auth 指令?
AppSync/Amplify - 如何定义 GraphQL 订阅