亚马逊AWS官方博客

AWS AppSync GraphQL API 支持 JavaScript 解析器

即日起,AWS AppSync 支持 JavaScript 解析器,并提供解析器评估引擎,用于在将解析器发布到云端之前对其进行测试。

AWS AppSync于 2017 年推出,该服务允许您在云中构建、管理和托管 GraphQL API。AWS AppSync 使用解析器将您的 GraphQL 架构连接到不同的数据来源。AWS AppSync 是通过解析器来转换 GraphQL 请求并从不同的数据来源提取信息。

直到今天,许多客户还只能使用 Apache Velocity 模板语言(VTL)编写解析器。要编写 VTL 解析器,许多开发人员需要学习一种新语言,这为其利用解析器提供的功能带来了不便。开发人员编写 VTL 解析器时,面临着如何测试的难题。这便是为何许多客户选择将其复杂的解析器编写为 AWS Lambda 函数,然后创建一个简单的 VTL 解析器来调用该函数。这增加了其应用程序的复杂性,因为他们现在必须维护和运行这一新的 Lambda 函数。

AWS AppSync 在 GraphQL 单个字段上执行解析器。有时,应用程序需要执行多个操作才能解析单个 GraphQL 字段。使用 AWS AppSync 时,开发人员可以创建管道解析器以形成组合操作(称为函数)并按顺序执行。每个函数均会对数据来源执行操作,例如,从 Amazon DynamoDB 表中提取项目。

函数的工作原理

推出 AWS AppSync JavaScript 管道解析器
现在,除了 VTL 之外,开发人员还可以使用 JavaScript 来编写其函数。您可以在管道解析器中混合使用 JavaScript 和 VTL 编写的函数。

这一新版本附带了两个新的 NPM 库来简化开发:@aws-appsync/eslint-plugin,用于在开发过程中快速捕获和修复问题;@aws-appsync/utils,用于在代码编辑器中提供类型验证和自动补全。

开发人员可以使用 AWS AppSync 的新 API 命令 evaluate-code 来测试其 JavaScript 代码。在测试期间,验证代码的正确性,并使用模拟数据进行评估。这可以帮助开发人员在将更改推送到云端之前验证其代码。

此次发布之后,AWS AppSync 成为您的应用程序与几乎所有 AWS 服务通信的最简单方式之一。您可以编写一个 HTTP 函数,使用 JavaScript 调用任何具有 API 端点的 AWS 服务,并将该函数用作管道的一部分。例如,您可以创建一个管道解析器,在对 GraphQL 字段进行查询时调用该解析器。此字段将返回存储在表中的项目的西班牙语翻译文本。该管道解析器由两个函数组成,一个函数从 DynamoDB 表中提取数据,另一个使用 Amazon Translate API 将项目文本翻译成西班牙语。

function awsTranslateRequest(Text, SourceLanguageCode, SourceLanguageCode) {
  return {
    method: 'POST',
    resourcePath: '/',
    params: {
      headers: {
        'content-type': 'application/x-amz-json-1.1',
        'x-amz-target': 'AWSShineFrontendService_20170701.TranslateText',
      },
      body: JSON.stringify({ Text, SourceLanguageCode, SourceLanguageCode }),
    },
  };
}

入门
您从 AWS AppSync 控制台或使用 AWS 命令行界面(CLI) 创建 JavaScript 函数。我们来创建一个管道解析器,使用 AWS CLI 从现有 DynamoDB 表中获取一个项目。这个解析器只有一个功能。

在创建新的 AWS AppSync 函数时,您需要为该函数提供代码。创建一个新的 JavaScript 文件并复制以下代码片段。

import { util } from '@aws-appsync/utils';

/**
 * 从附带的 DynamoDB 表中请求单个项目
 * @param ctx 请求上下文
 */
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: util.dynamodb.toMapValues({ id: ctx.args.id }),
  };
}

/**
 * 直接返回 DynamoDB 结果
 * @param ctx 请求上下文
 */
export function response(ctx) {
  return ctx.result;
}

所有函数都需要有请求响应方法,在每种方法中,您都可以执行满足业务需求的操作。

首先,请确保您拥有最新版本的 AWS CLI,并已创建 DynamoDB 表,而且拥有 AWS AppSync API。然后,您可以使用 AWS CLI create-function 命令和刚刚创建的文件在 AWS AppSync 中创建函数。此命令将返回函数 ID。要创建解析器,请传递函数 ID、GraphQL 操作以及要应用解析器的字段。在文档中,您可以找到有关如何创建管道解析器的详细教程。

测试解析器
要测试函数,请使用 AWS CLI 或 AWS SDK 中的 evaluate-code 命令。此命令调用 AWS AppSync 服务,并使用提供的上下文评估代码。要自动化测试,您可以使用任何 JavaScript 测试和断言库。例如,以下代码片段使用 Jest 以编程方式验证返回的结果。

import * as AWS from 'aws-sdk'
import { readFile } from 'fs/promises'
const appsync = new AWS.AppSync({ region: 'us-east-2' })
const file = './functions/updateItem.js'

test('validate an update request', async () => {
  const context = JSON.stringify({
    arguments: {
      input: { id: '<my-id>', title: 'change!', description: null },
    },
  })
  const code = await readFile(file, { encoding: 'utf8' })
  const runtime = { name: 'APPSYNC_JS', runtimeVersion: '1.0.0' }
  const params = { context, code, runtime, function: 'request' }

  const response = await appsync.evaluateCode(params).promise()
  expect(response.error).toBeUndefined()
  expect(response.evaluationResult).toBeDefined()
  const result = JSON.parse(response.evaluationResult)
  expect(result.key.id.S).toEqual(context.arguments.input.id)
  expect(result.update.expressionNames).not.toHaveProperty('#id')
  expect(result.update.expressionNames).toHaveProperty('#title')
  expect(result.update.expressionNames).toHaveProperty('#description')
  expect(result.update.expressionValues).not.toHaveProperty(':description')
})

通过这种方式,您可以将 API 测试添加到构建流程中,并在将更改推送到云端之前,验证解析器的编码是否正确。

立即开始使用
AWS AppSync 中对 JavaScript AWS AppSync 解析器的支持适用于目前支持AWS AppSync 的所有区域。您目前可以从 AWS 管理控制台、AWS CLI 或 Amazon CloudFormation 开始使用此功能。

访问 AWS AppSync 服务页面,了解有关此次发布的更多信息。

Marcia