AppSync自定义Resolver报BatchPutItem不支持及响应模板转换错误如何解决
问题解决办法
1. 解决Unsupported operation 'BatchPutItem'报错
报错原因
你当前使用的DynamoDB数据源属于版本化数据源(即之前开启过冲突检测/Delta Sync功能的数据源),哪怕你手动关闭了冲突检测,数据源的版本化属性依然保留,这类数据源官方限制仅支持错误信息里列出的操作,不支持BatchPutItem。
可选解决方案
- 方案一:替换为普通非版本化DynamoDB数据源
进入AppSync控制台,新建一个普通DynamoDB数据源,直接绑定Usertable1-staging表,创建时不要开启任何版本控制、冲突检测、Delta Sync配置,将该自定义Resolver的数据源替换为新创建的普通数据源,你现有的请求映射模板不需要修改即可正常运行。 - 方案二:保留现有数据源,改用
TransactWriteItems实现批量写入
如果你必须使用当前版本化数据源,可以将请求模板的操作替换为TransactWriteItems,单批次同样支持最多25条写入,符合你的需求,参考请求模板如下:#set($pdata = []) #foreach($item in ${ctx.args.input}) $util.qr($item.put("createdAt", $util.time.nowISO8601())) $util.qr($item.put("updatedAt", $util.time.nowISO8601())) $util.qr($item.put("__typename", "UserNF")) $util.qr($item.put("id", $util.defaultIfNullOrBlank($item.id, $util.autoId()))) #set($putOp = { "Put": { "TableName": "Usertable1-staging", "Item": $util.dynamodb.toMapValues($item) } }) $util.qr($pdata.add($putOp)) #end { "version" : "2018-05-29", "operation" : "TransactWriteItems", "transactItems": $utils.toJson($pdata) }
2. 解决Unable to transform Response Template报错
报错原因
BatchPutItem/TransactWriteItems的返回结构和你配置的响应映射模板不匹配,无法适配你GraphQL Schema中createBatchUNF接口定义的{items: [...]返回格式。
解决方法
将Resolver的响应映射模板修改为如下内容,适配返回结构:
#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end ## 如果你用的是BatchPutItem,用下面这段提取结果 #set($returnItems = $ctx.result.data.Usertable1-staging) ## 如果你用的是TransactWriteItems,不需要返回内容的话可以直接拿请求里的input补全返回,或者从响应里提取 ## #set($returnItems = $ctx.args.input) #set($result = { "items": $returnItems }) $util.toJson($result)
额外注意事项
你当前发送的mutation请求里user NFPOwnerId字段中间有多余空格,需要修正为正确的无空格字段名,避免参数解析错误。
内容的提问来源于stack exchange,提问作者HackRx
相关产品推荐
相关产品推荐

