如何在AppSync GraphQL模式中使用自定义输入类型?

如何在AppSync GraphQL模式中使用自定义输入类型?,graphql,amazon-dynamodb,aws-appsync,Graphql,Amazon Dynamodb,Aws Appsync,我正在试验AppSync+DynamoDB。我希望在GraphQL架构中具有以下类型: type User { user_id: String! } type Box { name: String! user: User! } 如何在DynamoDB中创建一个表来存储指向另一个表的项(在我的例子中,我希望表BoxTable的user字段作为表UserTable中用户的引用) 我如何在AppSync中定义上述模式?当我将用户:用户!设置为GraphQL输入类型时,我得

我正在试验AppSync+DynamoDB。我希望在GraphQL架构中具有以下类型:

type User {
    user_id: String!
}

type Box {
    name: String!
    user: User!

}
如何在DynamoDB中创建一个表来存储指向另一个表的项(在我的例子中,我希望表
BoxTable
user
字段作为表
UserTable
中用户的引用)


我如何在AppSync中定义上述模式?当我将
用户:用户!
设置为GraphQL输入类型时,我得到了错误
预期用户。

根据我对您问题的理解,这些是我的答案

如何在DynamoDB中创建一个表来存储指向另一个表的项

DynamoDB不是关系数据库,不提供外键或表联接。因此,要实现您在文章中提到的功能,您仍然需要调用DynamoDB两次才能获取
框的所有信息,即首先从
BoxTable
获取
Box
项,然后从
user
获取
项m
UserTable
基于
user\u id
。如果您的用例是先获得
user
,那么您可以使用过滤器by
user\u id
获得

现在转到你文章的第二部分

如何在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,除非您在
框中为
user
type附加了单独的解析程序。例如:

Query that returns Box --> Resolver

type Box {
    name
    user --> Attach resolver to get user_id from your UserTable
}
另一种方法是使用管道解析程序,您可以在其中创建多个函数,每个函数都可以使用上一个函数的结果并查询数据库。这些函数按照您指定的顺序运行。例如:

Query that returns Box --> Resolver

type Box {
    name
    user --> Attach resolver to get user_id from your UserTable
}
  • BoxTable
    获取
    Box
    的函数
  • 使用
    user\u id
    from
    ctx.prev.result
    UserTable
    获取
    user
    的函数
  • 最后,根据模式中的
    Box
    类型,将上述两个结果合并为一个JSON对象