【问题标题】:How to access arguments on child resolver from parent call in AWS Appsync如何从 AWS Appsync 中的父调用访问子解析器上的参数
【发布时间】:2019-11-25 22:24:03
【问题描述】:

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

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

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

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

我尝试将解析器附加到 cmets(在 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 以获取 cmets(内容包含传递的字符串)? 我可以这样做吗(访问如果 cmets.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}"
            }
        }
    }
}

【问题讨论】:

  • 你试过${context.source.content}吗?这应该使您可以在嵌套解析器中访问父参数。

标签: aws-appsync resolver


【解决方案1】:

您通过 $ctx.args 访问的 GraphQL 参数在 field 级别可用。因此,当您在解析 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 字段作为待办事项结果的一部分返回。然后您就可以通过$ctx.source.contentTodo.comments 解析器中访问它。

【讨论】:

  • 您好,如何在 cmets 解析器中访问 c​​mets 中传递的内容 args?
  • 如果我使用以下方法在 getTodo 解析器的结果中传递内容,我是否能够访问 Todo.contents 解析器中的内容:#set($result = $ctx.result)#set($result.content = $util.parseJson($ctx.args.content))$util.toJson($result)
  • 您要采用哪种解决方案?如果您可以通过在 Todo.cmets 字段上添加内容参数来更改架构,那么您可以通过 Todo.cmets 解析器中的 $ctx.args.content 访问参数。
猜你喜欢
  • 2019-03-01
  • 2021-12-03
  • 2019-12-04
  • 2020-04-12
  • 2018-10-11
  • 2019-08-23
  • 2018-12-20
  • 2019-02-04
  • 2019-08-10
相关资源
最近更新 更多