通过AWS AppSync解析器结合DynamoDB自动添加时间戳失败求助
AWS AppSync解析器自动添加时间戳失效的排查与修复方案
先梳理你代码里的几个关键问题,这些正是导致时间戳没生效的核心原因:
问题排查点
- 变量大小写不匹配:你定义了
$myfoo(全小写),但后续赋值用的是$myFoo(驼峰格式),Velocity模板是大小写敏感的,这会导致你对version和timestamp的赋值根本没作用在原来的对象上。 - 时间戳工具调用不完整:你的代码里
$ut...明显截断了,需要用正确的util.time方法来生成合法的时间戳。 - 未将修改后的对象绑定到操作:你修改了
$myFoo但没把它放到PutItem的attributeValues字段里,DynamoDB无法自动读取这个变量的内容。
修复后的完整解析器代码
{ "version" : "2017-02-28", "operation" : "PutItem", "key": { "id" : $util.dynamodb.toDynamoDBJson($util.autoId()) }, "attributeValues": #set( $myFoo = $util.dynamodb.toMapValues($ctx.args) ) #set( $myFoo.version = $util.dynamodb.toNumber(1) ) #set( $myFoo.timestamp = $util.dynamodb.toNumber($util.time.nowEpochSeconds()) ) $util.toJson($myFoo) }
关键细节说明
- 统一变量名:把初始定义的
$myfoo改成和后续一致的$myFoo,确保所有赋值操作都作用在同一个对象上。 - 正确生成时间戳:用
$util.time.nowEpochSeconds()生成Unix时间戳(数字类型,适合DynamoDB的Number类型字段);如果需要ISO格式的字符串时间,改用$util.time.nowISO8601(),记得对应使用$util.dynamodb.toStr()做类型转换。 - 绑定到attributeValues:修改后的
$myFoo必须通过$util.toJson()传入attributeValues字段,这样DynamoDB才能接收到包含时间戳和版本号的完整数据。
如果后续需要实现更新操作时自动递增版本号,还可以结合DynamoDB的条件表达式做进一步优化,不过这属于额外需求啦。
内容的提问来源于stack exchange,提问作者Jeff Gu Kang
相关产品推荐
相关产品推荐

