AppSyncのGraphQLで「Expected type ‘Int’ but was ‘Long’.」が出た時に見る覚書

GraphQLでDynamoDBに保存している数値を扱う時、たまにこういう結果が変えることがあります。 これは数値が大きすぎる場合に出るエラーで、「GraphQLのschemaをLongにすれば解決」とはいきません。 調 […]

広告ここから
広告ここまで

目次

    GraphQLでDynamoDBに保存している数値を扱う時、たまにこういう結果が変えることがあります。

    {
      "data": {
        "getSomething": {
          "hugeIntValue": null
        }
      },
      "errors": [
        {
          "path": [
            "getSomething",
            "hugeIntValue"
          ],
          "locations": null,
          "message": "Can't serialize value (/getSomething/hugeIntValue) : Expected type 'Int' but was 'Long'."
        }
      ]
    }

    これは数値が大きすぎる場合に出るエラーで、「GraphQLのschemaをLongにすれば解決」とはいきません。

    調べてみると、数値が 2147483648 以上になるとリゾルバの内部で Long 型として扱われるように見える。

    https://motemen.hatenablog.com/entry/2018/05/appsync-epochmilli-datetime

    対策としては、「Response Mapping TemplateでString変換してやる」というのがあります。

    Queryの場合のサンプル

    #set($result=[])
    #foreach($item in $context.result.items)
      #if(!$util.isNullOrBlank($item.hugeIntValue))
        $util.qr($item.put("hugeIntValue", "$item.hugeIntValue"))
      #end
      $util.qr($result.add($item))
    #end
    #set($response={"items": $result})
    $util.toJson($response)

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark