除了发送查询和变异以进行调试和日志记录之外,是否有任何简单的方法来记录或调试来自请求映射模板和响应映射模板的VTL?
此外,是否有任何游乐场可以像在Web控制台中使用JavaScript一样检查和玩耍VTL?
我们可以离线使用AWS AppSync并检查VTL中编写的所有内容是否按预期工作吗?
除了发送查询和变异以进行调试和日志记录之外,是否有任何简单的方法来记录或调试来自请求映射模板和响应映射模板的VTL?
此外,是否有任何游乐场可以像在Web控制台中使用JavaScript一样检查和玩耍VTL?
我们可以离线使用AWS AppSync并检查VTL中编写的所有内容是否按预期工作吗?
一个非常不好的记录和调试方式是在响应映射中使用验证(validate)
$util.validate(false, $util.time.nowISO8601().substring(0, 10) )
这是我在我的VTL解析器中记录值的方法:
在您的请求或响应模板中添加"$util.error"语句,然后进行graphql调用。
例如,我想查看传递给我的解析器作为输入的参数是什么,因此我在模板开头添加了$util.error语句。 因此,我的模板现在如下:
$util.error("Test Error", $util.toJson($ctx))
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.arguments.user.id)
},
"attributeValues": {
"name": $util.dynamodb.toDynamoDBJson($ctx.arguments.user.name)
}
}
然后从 AWS AppSync 控制台的“查询”部分,我运行了以下变更操作:
mutation MyMutation {
addUser(user: {id: "002", name:"Rick Sanchez"}) {
id
name
}
}
这显示了我的解析器的日志结果如下:
{
"data": null,
"errors": [
{
"path": [
"addUser"
],
"data": null,
"errorType": "{\"arguments\":{\"user\":{\"id\":\"002\",\"name\":\"Rick Sanchez\"}},\"identity\":null,\"source\":null,\"result\":null,\"request\":{\"headers\":{\"x-forwarded-for\":\"112.133.236.59, 130.176.75.151\",\"sec-ch-ua-mobile\":\"?0\",\"cloudfront-viewer-country\":\"IN\",\"cloudfront-is-tablet-viewer\":\"false\",\"via\":\"2.0 a691085135305af276cea0859fd6b129.cloudfront.net (CloudFront)\",\"cloudfront-forwarded-proto\":\"https\",\"origin\":\"https://console.aws.amazon.com\",\"content-length\":\"223\",\"accept-language\":\"en-GB,en;q=0.9,en-US;q=0.8\",\"host\":\"raxua52myfaotgiqzkto2rzqdy.appsync-api.us-east-1.amazonaws.com\",\"x-forwarded-proto\":\"https\",\"user-agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66\",\"accept\":\"*/*\",\"cloudfront-is-mobile-viewer\":\"false\",\"cloudfront-is-smarttv-viewer\":\"false\",\"accept-encoding\":\"gzip, deflate, br\",\"referer\":\"https://console.aws.amazon.com/\",\"x-api-key\":\"api-key-has-been-edited-out\",\"content-type\":\"application/json\",\"sec-fetch-mode\":\"cors\",\"x-amz-cf-id\":\"AvTMLvtxRq9M8J8XntvkDj322SZa06Fjtyhpf_fSXd-GmHs2UeomDg==\",\"x-amzn-trace-id\":\"Root=1-5fee036a-13f9ff472ba6a1211d499b8b\",\"sec-fetch-dest\":\"empty\",\"x-amz-user-agent\":\"AWS-Console-AppSync/\",\"cloudfront-is-desktop-viewer\":\"true\",\"sec-fetch-site\":\"cross-site\",\"sec-ch-ua\":\"\\\"Chromium\\\";v=\\\"87\\\", \\\" Not;A Brand\\\";v=\\\"99\\\", \\\"Microsoft Edge\\\";v=\\\"87\\\"\",\"x-forwarded-port\":\"443\"}},\"info\":{\"fieldName\":\"addUser\",\"parentTypeName\":\"Mutation\",\"variables\":{}},\"error\":null,\"prev\":null,\"stash\":{},\"outErrors\":[]}",
"errorInfo": null,
"locations": [
{
"line": 9,
"column": 3,
"sourceName": null
}
],
"message": "Test Error"
}
]
}
$util.error("DEBUG", 'REQUEST', null, $postBody)
这会生成以下响应:"message": "DEBUG",
"errorType": "REQUEST",
"data": null,
"errorInfo": "{\"postBodyStuff\":\"whatever\"}"
- ConorLuddycontext
和这些 info
字段是有帮助的:$util.error($util.toJson($context), $util.toJson($context.info.selectionSetList), null, $util.toJson($context.info.selectionSetGraphQL))
。 - Santiago看起来你正在寻找这个新的VTL日志实用程序,例如
$util.log.info(Object) : Void
文档: https://docs.aws.amazon.com/appsync/latest/devguide/utility-helpers-in-util.html
当我意识到调试VTL有多么痛苦时,我创建了一个lambda(nodejs),记录了我的VTL模板的内容。
// my nodejs based debug lambda -- very basic
exports.handler = (event, context, callback) => {
const origin = context.request || 'oops';
if (context && context.prev) {
console.log('--------with context----------------');
console.log({ prev: context.prev.result, context, origin });
console.log({ stash: context.stash });
console.log('--------END: with context----------------');
callback(null, context.prev.result);
}
console.log('inside - LOGGING_DEBUGGER');
console.log({ event, context: context || null, origin });
callback(null, event);
};
$ctx.stash
中。然后,在我的管道中,在此步骤之后添加了“debugger”函数——以防出现问题,导致我的管道在发生致命错误之前崩溃。这个问题已经有一段时间了,自问出现以来发生了很多变化。我会尽力提供更现代的见解。
首先,值得一提的是,AppSync 现在支持 JavaScript 解析器。这对开发者体验来说是一个重要的变革。我强烈推荐使用。
回答原始问题:
对于 JS 解析器,您可以简单地使用 console.log()
。记录的数据将显示在 CloudWatch 中。
aws CLI 自带一个命令,允许您测试解析器,而无需部署和调用查询。请参阅文档
您还可以使用评估命令来编写单元/集成测试
除了上述所有“内置”解决方案外,我还创建了一个名为GraphBolt的应用程序,旨在改善AWS AppSync DX并解决此处提到的一些痛点。
从CloudWatch日志工具中检查$util.log.info(Object) : Void
附注:您需要打开Amazon CloudWatch Logs的日志记录,并将字段解析器日志级别设置为ALL,更多详细信息请参见此处。