[英]How to use custom input types in AppSync GraphQL schema?
我正在试验 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.
Expected User. to be a GraphQL input type.
?
根据我对您问题的理解,这些是我的回答。
如何在 DynamoDB 中创建一个存储指向另一个表的项目的表
DynamoDB 不是关系数据库,不提供外键或表连接。 因此,要实现您在帖子中提到的内容,您仍然需要两次调用 DynamoDB 来获取Box
的所有信息,即首先从BoxTable
获取Box
项目,然后根据user_id
从UserTable
获取user
。 如果您的用例是您首先获得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
为 null,除非您在Box
类型中附加一个带有user
类型的单独解析器。 例如:
Query that returns Box --> Resolver
type Box {
name
user --> Attach resolver to get user_id from your UserTable
}
另一种方法是利用管道解析器,您可以在其中创建多个函数,每个函数都可以使用之前 function 的结果并查询数据库。 这些函数按照您指定的顺序运行。 例如:
BoxTable
获取Box
。ctx.prev.result
的user_id
从UserTable
获取user
。Box
类型,将上述两个结果合并为一个 JSON object。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.