首页 > 解决方案 > 如何从 AWS Appsync 中的父调用访问子解析器上的参数

问题描述

我有两种类型:待办事项和评论。

type Todo {
    id: ID!
    name: String
    description: String
    priority: Int
    status: TodoStatus
    comments: [Comment]
}
type Comment {
    todoid: ID!
    commentid: String!
    content: String
}

然后我有一个 Query getTodo 但问题是我想包含一个内容 arg,如果传递的字符串在 Comment 的内容中,则过滤评论(子)。

getTodo(id: ID!, content: String!): Todo

我尝试将解析器附加到评论(在 Todo 下)。如果我在这里添加一个过滤器,我将如何获得在 getTodo(id: ID!, content: String!) 中传递的 ctx.args.content。

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "todoid = :id",
        "expressionValues" : {
            ":id" : {
                "S" : "${ctx.args.id}"
            }
        }
    },
    "filter": {
        "expression": "contains(content, :content)",
        "expressionValues" : {
            ":content": {
                "S": "${ctx.args.content}"
            }
        }
    }
}

或者,如果我删除此过滤器并将其保留为:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "todoid = :id",
        "expressionValues" : {
            ":id" : {
                "S" : "${ctx.args.id}"
            }
        }
    }
}

我将如何修改 getTodo Resolver 以获取评论(内容包含传递的字符串)?我可以这样做吗(如果 comments.content 包含传递的内容字符串 args 则访问):

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "id = :id",
        "expressionValues" : {
            ":id" : {
                "S" : "${ctx.args.id}"
            }
        }
    },
    "filter": {
        "expression": "contains(comments.content, :content)",
        "expressionValues" : {
            ":content": {
                "S": "${ctx.args.content}"
            }
        }
    }
}

标签: aws-appsyncresolver

解决方案


您访问的 GraphQL 参数$ctx.args字段级别可用。因此,当您在解析Post.comments字段时访问它们时,您将返回该字段上的所有参数,并且仅返回该字段。

因此,要获取内容字符串参数,您可以将Todo类型更新为:

type Todo {
    id: ID!
    name: String
    description: String
    priority: Int
    status: TodoStatus
    comments(content: String): [Comment]
}

另一种方式,如果您不想在字段上公开内容参数Post.comments并将参数保留在Query.getTodo字段上,您可以通过源传递参数。在您的Query.getTodo解析器中,您可以将该content字段作为待办事项结果的一部分返回。然后,您将能够Todo.comments通过$ctx.source.content.


推荐阅读