【问题标题】:Where can I log & debug Velocity Template Language (VTL) in AWS AppSync?我可以在哪里记录和调试 AWS AppSync 中的 Velocity 模板语言 (VTL)?
【发布时间】:2018-11-09 12:39:16
【问题描述】:
  1. 是否有任何简单的方法来记录或调试来自请求映射模板和响应映射模板的 VTL,而不是发送 查询突变 来调试和记录?

  2. 另外,是否有任何 Playground 可以检查和使用 VTL,就像我们可以在 Web 控制台中使用 JavaScript 一样?

  3. 我们可以离线使用 AWS AppSync 并检查用 VTL 编写的所有内容是否按预期工作?

【问题讨论】:

  • 1.感谢您提出这个问题。我是 AWS AppSync 团队的一员,将代表您在内部跟进功能请求。 2. 您目前可以通过 AppSync 控制台使用模拟/测试数据测试您的映射模板。 3. 方法 #2 不涉及到 DataSources 的往返,测试数据用于验证您的模板。
  • 谢谢@ShankarRaju 另外,文档还没有。所以,如果可以的话,请让它们变得更好。这是我的相关问题twitter.com/deadcoder0904/status/997431929346707456
  • 会将您的反馈反馈给团队。感谢您的意见。
  • @ShankarRaju 这是为这些模板引入另一种语言的垃圾方式。为什么不使用广泛使用的编程语言,例如 nodejs、python,因为我们纯粹是在处理数据对象。在我 25 多年的经验中,我从未见过任何了解 VTL 的人,而且我认为没有必要。

标签: amazon-web-services aws-appsync


【解决方案1】:

当我意识到调试 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);
};

这个 lambda 帮助我调试了管道解析器中的许多问题。但是,我忘记了我是否将它用作直接 lambda 或请求+响应模板。

为了使用它,我将想要调试的值放入我的其他管道函数中的$ctx.stash。然后在我的管道中,我在这一步之后添加了“调试器”功能——以防在发生致命错误之前我的管道会爆炸。

【讨论】:

    【解决方案2】:

    这是我在 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\"}"
    • 打印context 和这些info 字段很有帮助:$util.error($util.toJson($context), $util.toJson($context.info.selectionSetList), null, $util.toJson($context.info.selectionSetGraphQL))
    【解决方案3】:

    您的 3 个问题的答案如下:

    1. 要对请求/响应映射模板进行单元测试,您可以使用本博文 (https://mechanicalrock.github.io/2020/04/27/ensuring-resolvers-aren't-rejected.html) 中描述的方法。
    2. AWS AppSync 控制台中有一个用于 VTL 实验的 Playground,您可以在其中编辑和测试解析器的 VTL。
    3. Amplify 框架具有模拟 AppSync、AppSync VTL 环境和 DynamoDB(使用 DynamoDB Local)的模拟功能。这将允许您在本地执行 e2e 测试。

    【讨论】:

      【解决方案4】:

      一种超级讨厌的记录和调试方式是在响应映射中使用验证

      $util.validate(false, $util.time.nowISO8601().substring(0, 10) )
      

      【讨论】:

      • 当我再次使用 appsync 时,我会在答案中打勾,直到获得投票为止:)
      • 它被称为半生不熟的产品,由 AWS 发布到生产环境
      • 调试 AppSync VTL 是一场噩梦 :-(
      • 为什么在我开始使用 AppSync 之前没有找到以上两个 cmets?...
      • AWS 发布了 Amplify 更新。他们在那里获得了一些本地 vtl 调试支持。 aws.amazon.com/blogs/mobile/amplify-framework-local-mocking 但总体上调试 VTL 仍然是一场噩梦
      猜你喜欢
      • 2022-12-06
      • 2020-09-05
      • 2020-06-22
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2018-01-29
      • 2019-08-18
      • 2011-09-01
      相关资源
      最近更新 更多