测试和调试解析器 (JavaScript) - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

测试和调试解析器 (JavaScript)

Amazon AppSync 针对数据源在 GraphQL 字段上执行解析器。使用管道解析器时,函数会与您的数据源交互。如JavaScript 解析器概述中所述,函数使用在APPSYNC_JS运行时运行时编写的请求和响应处理程序与数据源通信。 JavaScript 这使您能够在与数据源通信之前和之后提供自定义逻辑和条件。

为了帮助开发人员编写、测试并调试这些解析程序,Amazon AppSync 控制台还提供工具,针对每个字段的解析程序使用模拟数据创建 GraphQL 请求和响应。此外,您可以在Amazon AppSync 控制台中执行查询、变更和订阅,并查看来自亚马逊 CloudWatch 的整个请求的详细日志流。其中包括从数据源获得的结果。

使用模拟数据进行测试

在调用 GraphQL 解析程序时,它包含的 context 对象具有您所编程的请求的相关信息。其中包括来自客户端的参数、身份信息以及 GraphQL 父字段的数据。它还具有来自数据源的结果,可以在响应处理程序中使用。有关此结构以及编程时可用的帮助器实用程序的更多信息,请参阅 Resolver 上下文对象参考

在编写或编辑解析程序函数时,您可以将模拟测试 context 对象传递到控制台编辑器中。这使您无需实际针对数据源运行即可查看请求处理程序和响应处理程序的评估情况。例如,您可以传递测试 firstname: Shaggy 参数,观察在您的模板代码中使用 ctx.args.firstname 时如何评估。您还可以测试任何实用程序帮助程序(例如 util.autoId()util.time.nowISO8601())的评估。

测试解析器

此示例将使用Amazon AppSync 控制台测试解析器。

  1. 登录 Amazon Web Services Management Console并打开 AppSync 控制台

    1. API 控制面板中,选择你的 GraphQL API。

    2. 在侧中,选择函数

  2. 选择 Create function(创建函数)。

  3. “编辑解析器” 页面的顶部,选择 “选择测试上下文”,选择 “创建新上下文”。

  4. 在下面的执行上下文窗口中选择示例上下文对象或手动填充 JSON。

  5. 输入文本上下文名称

  6. 选择保存按钮。

  7. 要使用此模拟上下文对象评估解析程序,请选择 Run Test (运行测试)

举一个更实际的例子,假设您有一个存储了 GraphQL 类型的应用程序Dog,该应用程序使用自动生成对象的 ID 并将其存储在 Amazon DynamoDB 中。您还希望写入 GraphQL 更改参数的一些值,而且仅允许特定用户看到响应。下面显示了架构的外观:

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

你可以编写一个Amazon AppSync 函数并将其添加到addDog解析器中来处理突变。要测试您的Amazon AppSync 函数,您可以填充上下文对象,如下例所示。以下代码拥有 nameage 客户端的参数,以及 identity 对象中填充的 username

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}", "username" : "Nadia", "claims" : { }, "sourceIp" :[ "x.x.x.x" ], "defaultAuthStrategy" : "ALLOW" } }

您可以使用以下代码测试您的Amazon AppSync函数:

import { util } from '@aws-appsync/utils'; export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id: util.autoId() }), attributeValues: util.dynamodb.toMapValues(ctx.args), }; } export function response(ctx) { if (ctx.identity.username === 'Nadia') { console.log("This request is allowed") return ctx.result; } util.unauthorized(); }

评估的请求和响应处理程序包含来自您的测试上下文对象的数据和来自的生成的值util.autoId()。此外,如果您要将 username 更改为除 Nadia 之外的值,将不会返回结果,因为授权检查将失败。有关细粒度访问控制的更多信息,请参阅授权用例

使用的 API 测试请求和响应处理Amazon AppSync程序

您可以使用EvaluateCode API 命令使用模拟数据远程测试您的代码。要开始使用该命令,请确保您已将权appsync:evaluateMappingCode限添加到策略中。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateCode", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

您可以使用Amazon CLIAmazonSDK 来利用该命令。例如,以上一节中的Dog架构及其Amazon AppSync 函数请求和响应处理程序为例。使用本地工作站上的 CLI 将代码保存到名为的文件中code.js,然后将该context对象保存到名为的文件中context.json。从外壳程序中,运行以下命令:

$ aws appsync evaluate-code \ --code file://code.js \ --function response \ --context file://context.json \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0

该响应evaluationResult包含您的处理程序返回的有效负载。它还包含一个logs对象,用于保存您的处理程序在评估期间生成的日志列表。这样可以轻松调试代码执行并查看有关评估的信息,以帮助排除故障。例如:

{ "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}", "logs": [ "INFO - code.js:13:5: \"This request is allowed\"" ] }

evaluationResult可以解析为 JSON,它给出:

{ "breed": "Miniature Schnauzer", "color": "black_grey" }

使用 SDK,您可以轻松整合来自您最喜欢的测试套件的测试,以验证处理者的行为。我们建议使用 Jest 测试框架创建测试,但任何测试套件都可以使用。以下片段显示了假设的验证运行。请注意,我们希望评估响应是有效的 JSON,因此我们使用JSON.parse从字符串响应中检索 JSON:

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0') test('request correctly calls DynamoDB', async () => { const code = fs.readFileSync('./code.js', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

这将生成以下结果:

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 totalTime: 1.511 s, estimated 2 s

调试实时查询

调试生产应用程序的 end-to-end 测试和日志记录是无可替代的。Amazon AppSync 允许您使用亚马逊记录错误和完整的请求详情 CloudWatch。此外,您可以使用 Amazon AppSync 控制台测试 GraphQL 查询、更改和订阅,以及返回查询编辑器的每个请求的实时流日志数据,以便进行实时调试。对于订阅而言,日志显示连接时间信息。

要执行此操作,您需要提前启用 Amazon CloudWatch 日志,如监控和日志中所述。接下来,在 Amazon AppSync 控制台中,选择 Queries (查询) 选项卡,然后输入有效的 GraphQL 查询。在右下角部分,单击并拖动 “日” 窗口以打开日志视图。在页面顶部,选择“播放”箭头图标运行您的 GraphQL 查询。片刻之后,此操作的完整请求和响应日志将流式传输到控制台的这一部分,之后您可以在控制台中进行查看。