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)