在 AWS AppSync () JavaScript 中测试和调试解析器 - AWS AppSync

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

在 AWS AppSync () JavaScript 中测试和调试解析器

AWS AppSync 针对数据源对 GraphQL 字段执行解析器。在使用管道解析器时,函数与数据来源交互。如JavaScript 解析器概述中所述,函数通过使用写入运行时并在运行时运行的请求和响应处理程序与数据源进行通信。 JavaScript APPSYNC_JS这样,您就可以在与数据来源通信之前和之后提供自定义逻辑和条件。

为了帮助开发者编写、测试和调试这些解析器, AWS AppSync 控制台还提供了一些工具,用于创建 GraphQL 请求和响应,并将模拟数据传递给各个字段解析器。此外,您还可以在 AWS AppSync 控制台中执行查询、变更和订阅,并查看来自 Amazon CloudWatch 的整个请求的详细日志流。这包括来自数据来源的结果。

使用模拟数据进行测试

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

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

测试解析器

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

  1. 登录 AWS Management Console 并打开AppSync控制台

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

    2. 侧边栏中,选择函数

  2. 选择一个现有的函数。

  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 }

你可以编写一个 AWS AppSync 函数并将其添加到你的addDog解析器中来处理突变。要测试您的 AWS 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" } }

您可以使用以下代码测试您的 AWS 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 之外的值,将不会返回结果,因为授权检查将失败。有关精细访问控制的更多信息,请参阅授权使用案例

使用's测试请求和响应处理 AWS AppSync程序 APIs

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

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

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

$ 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测试和日志记录之外,别无选择。 AWS AppSync 允许您使用 Amazon 记录错误和完整的请求详情 CloudWatch。此外,您可以使用 AWS AppSync 控制台测试 GraphQL 查询、突变和订阅,并将每个请求的实时日志数据流回查询编辑器进行实时调试。对于订阅而言,日志显示连接时间信息。

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