在AWS AppSync中传递nextToken和lastSync值时遇DynamoDB错误如何解决?
问题场景
当调用AppSync的syncObjects查询并携带上一次返回的nextToken和lastSync参数时,触发以下DynamoDB错误:
Error: The supplied Item contains a null AttributeValue (Service: DynamoDb, Status Code: 400.
查询语句示例:
query MyQuery { syncObjects(limit: 10, nextToken: "123", lastSync: 1111) { items { _deleted id } startedAt nextToken } }
不带nextToken时查询正常,且在AppSync控制台操作也存在同样问题。
排查与解决步骤
确保nextToken完整且未被修改
AppSync返回的nextToken是经过编码的复合分页上下文,包含DynamoDB分页所需的主键数据。如果传递的nextToken被截断、手动修改或编码错误,会导致DynamoDB解析时出现null属性值。必须直接使用上一次查询响应返回的完整nextToken字符串,不要做任何额外的转义、截取或格式转换。验证lastSync参数类型匹配
检查AppSync Schema中lastSync的定义类型(通常是Int或Float),确保传递的参数类型与Schema一致。例如,如果Schema定义为Int,就不能传递字符串格式的数字,必须直接传数值类型的参数,类型不匹配会导致resolver处理时生成无效的DynamoDB请求。检查DynamoDB索引与数据完整性
sync查询依赖DynamoDB的全局二级索引(GSI)或本地二级索引(LSI)来实现分页和增量同步。确认索引的键属性(如_lastChangedAt、_version)在表中没有null值,且索引的键类型与Schema定义一致。如果索引中存在null属性的条目,分页查询时会触发DynamoDB的null属性错误。排查自定义sync resolver逻辑
如果使用了自定义VTL resolver处理sync请求,检查模板中是否正确解析和传递nextToken:- 确保使用
$util.dynamodb.fromJson($ctx.args.nextToken)正确解码nextToken为DynamoDB的ExclusiveStartKey - 检查模板中是否存在错误的条件判断,导致某些属性被设置为null后传递给DynamoDB
- 验证resolver生成
nextToken的逻辑,确保编码后的nextToken不包含null值的键
- 确保使用
重置sync状态重试
如果上述步骤都无效,尝试重置客户端的sync状态:清除本地存储的lastSync和nextToken值,重新发起首次sync请求,获取新的nextToken后再尝试分页查询,排除旧的异常元数据导致的问题。
内容的提问来源于stack exchange,提问作者user16531209

