如何从AWS Appsync中的父调用访问子解析器上的参数

时间:2019-07-17 06:36:35

标签: aws-appsync resolver

我有两种类型:Todo和Comment。

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

然后我有一个查询getTodo,但问题是,如果要传递的字符串位于Comment的内容中,则我想包含一个内容arg来过滤注释(子项)。

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以获取注释(内容包含传递的字符串)? 我可以这样做吗(访问comment.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}"
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您通过$ctx.args访问的GraphQL参数在字段级别可用。因此,当您在解析Post.comments字段时访问它们时,您只获取该字段和该字段上的所有参数。

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

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

另一种方法,如果您不想在Post.comments字段中公开content参数,而又将参数保留在Query.getTodo字段中,则可以通过源传递参数。在您的Query.getTodo解析器中,您可以返回content字段作为待办事项结果的一部分。然后,您将可以通过Todo.comments$ctx.source.content解析器中访问它。