Search code examples
amazon-web-servicesgraphqlamazon-dynamodbaws-appsyncaws-cdk

AppSync Dynamodb Resolvers


I am trying to learn how to use AppSync and its DynamoDB integrations.

I have successfully created an AppSync GraphQL API and linked a resolver to a getter on the primary key and thought I understood what is happening. However, I can not get a putItem resolver to work at all and am struggling to find a useful way to debug the logic.

There is a cdk repository here which will deploy the app. Lines 133-145 have a hand written schema which I thought should work however that receives the error

One or more parameter values were invalid: Type mismatch for key food_name expected: S actual: NULL (Service: DynamoDb, Status Code: 400

I also have attempted to wrap the expressions in quotes but receive errors. Where should I go from here?

The example data creates a table with keys

  1. food_name
  2. scientific_name
  3. group
  4. sub_group

with food_name as the primary key.

https://github.com/AG-Labs/AppSyncTask

Today I have attempted to reimplement the list resolver as

{
    "version" : "2017-02-28",
    "operation" : "Scan",
    ## Add 'limit' and 'nextToken' arguments to this field in your schema to implement pagination. **
    "limit": $util.defaultIfNull(${ctx.args.limit}, 20),
    "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null))
}

with a response mapping of

$util.toJson($ctx.result.items)

In cloud watch I can see a list of results under log type ResponseMapping (albeit not correctly filtered but i'll ignore that for now) but these do not get returned to the querier. That result is simply

{
  "data": {
    "listGenericFoods": {
      "items": null
    }
  }
}

I don't understand where this is going wrong.


Solution

  • The problem was that the resolvers were nested.

    Writing a handwritten schema fixed the issue but resulted in a poorer API. Going back a few steps and will implement from the ground up slowly adding more resolvers.

    The CloudWatch Logs once turned on helped somewhat but still required a lot of changing the resolvers ever so slightly and retrying.