'Access requested fields in resolver mapping template

When we request a GraphQL query, for instance,

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

and we have configured a Lambda resolver in AWS AppSync, the request mapping template,

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

allows us to define the event object passed to the lambda handler.

For the above example, our Lambda handler would be invoked with an event event wherein event.payload.query.id == 123 or the like.

According to the docs the $context object comprises,

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

That said, the documentation does not mention where I can access the requested fields of the GraphQL query.

For the former example, these fields would correspond to ["id", "title"].

In the case that I need to resolve some nested properties, e.g. a tags array, of an object through an expensive operation, e.g. a SQL join, it would be beneficial if I could check if this nested property is actually requested.

This question relates to How to get requested fields inside GraphQL resolver?, however, it differs from in the GraphQL implementation graphql-tools vs AppSync.



Solution 1:[1]

There is now a $context.info.selectionSetList field that includes the requested field names. The official docs provide an example and explain some special use cases around interfaces and aliases.

Solution 2:[2]

The document has been updated, AWS added a new field info to the context, you can access the field name as below?

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

You can refer to the document here:

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 JWK
Solution 2 Yves M.