1 回答
- 最新
- 投票最多
- 评论最多
0
【以下的回答经过翻译处理】 我支持你,你的方向是对的
$!{expValues.put(":data", $util.dynamodb.toDynamoDBJson($context.arguments.input.data) )}
到
$!{expValues.put(":data", $util.dynamodb.toDynamoDB($context.arguments.input.data) )}
如果您使用控制台解析器测试器按原样运行您的解析器代码,您会注意到您的代码的输出是:
...
"expressionValues": {
":updatedAt": { "S": "2019-07-10T20:35:30.000Z" },
":data": "{\"S\":\"[{\\\"xyz\\\": 101}]\"}"
}
...
...
"expressionValues": {
":updatedAt": { "S": "2019-07-10T20:35:30.000Z" },
":data": "{\"S\":\"[{\\\"xyz\\\": 101}]\"}"
}
...
您会注意到这里的区别是":updatedAt"键打印了一个DynamoDB类型的对象。(参见:<https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference- dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-typed-values-request>),而":data"键打印了一个DynamoDB类型的对象,但作为一个字符串。这就是为什么您收到了"Expecting JSON object..."错误的原因,因为DynamoDB解析器期望一个JSON对象来指定要写入DynamoDB的值的类型。
如果您查看 DynamoDB Resolver Util 参考(参见:<https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html#dynamodb-helpers-in-util-dynamodb>) ,您会注意到`$util.dynamodb.toDynamoDBJson(Object)`方法返回一个字符串,您将其保存到`expValues`映射中,然后传递给`$util.toJson(Object)`,后者期望一个输入对象,并将其作为字符串返回,然后在vtl中打印为输出。我理解这可能会令人困惑,因为这里涉及了几个层次:您如何将值存储在`expValues`映射中,以及所有变量都必须评估为字符串,以便作为VTL的输出打印(总体上是一个字符串,用于表示DynamoDB数据源理解的JSON对象。
进一步查看解析器参考,您会看到`$util.dynamodb.toDynamoDB(Object)`方法,它返回一个Map,与您在":updatedAt"中定义的字面上的映射相同,即`{ "S": "$now" }`,这将为您提供预期的输出,将打印在`expressionValues`下。