【问题标题】:Access requested fields in resolver mapping template访问解析器映射模板中的请求字段
【发布时间】:2019-11-15 22:15:01
【问题描述】:

例如,当我们请求 GraphQL 查询时,

query GetPost {
  singlePost(id: 123) {
    id
    title
  }
}

我们已经在 AWS AppSync 中配置了一个 Lambda 解析器,即请求映射模板,

{
    "version": "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "resolve": "singlePost",
        "query": $utils.toJson($context.arguments)
    }
}

允许我们定义传递给 lambda 处理程序的事件对象。

对于上面的示例,我们的 Lambda 处理程序将通过事件 event 调用,其中 event.payload.query.id == 123 等。

根据the docs$context对象包括,

{
    "arguments" : { ... },
    "source" : { ... },
    "result" : { ... },
    "identity" : { ... },
    "request" : { ... }
}

也就是说,文档没有提到我可以在哪里访问 GraphQL 查询的请求字段

对于前一个示例,这些字段将对应于["id", "title"]

如果我需要解析一些嵌套属性,例如一个标签数组,一个对象通过昂贵的操作,例如一个 SQL 连接,如果我可以检查这个嵌套属性是否真的被请求,那将是有益的。

这个问题与 How to get requested fields inside GraphQL resolver? 相关,但是,它不同于 GraphQL 实现 graphql-tools vs AppSync。

【问题讨论】:

    标签: graphql aws-appsync


    【解决方案1】:

    不幸的是,这实际上不是 AppSync 今天所支持的。不过,这是我们从其他客户那里听到的请求,我将使用这篇文章作为 +1 来确定未来版本的优先级。

    【讨论】:

    【解决方案2】:

    文档已经更新,AWS在上下文中增加了一个新的字段info,你可以访问字段名称如下:

    {
        "version" : "2017-02-28",
        "operation" : "Invoke",
        "payload": {
          "resolve": "$ctx.info.fieldName",
          "query": $utils.toJson($context.arguments)
        }
    }
    

    您可以参考这里的文档:

    https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-info

    【讨论】:

    • info.fieldNameparent 上要求此解析器解析的字段,而不是原始问题所要求的最终对象上请求的字段名称数组。跨度>
    【解决方案3】:

    现在有一个 $context.info.selectionSetList 字段,其中包含请求的字段名称。 official docs 提供了一个示例并解释了一些围绕接口和别名的特殊用例。

    【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2019-11-04
    • 2017-09-10
    • 1970-01-01
    • 2013-06-09
    • 2022-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多