aws-appsync - 如何从 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}"
}
}
}
}
解决方案
您访问的 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
.