Lambda 的 AWS AppSync JavaScript 解析器函数参考 - AWS AppSync GraphQL

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

Lambda 的 AWS AppSync JavaScript 解析器函数参考

可以使用 AWS AppSync 函数和解析器来调用位于您账户中的 Lambda 函数。您可以在将请求有效载荷和 Lambda 函数响应返回给客户端之前对其进行调整。您还可以指定在请求对象中执行的操作类型。本节介绍了支持的 Lambda 操作的请求。

请求对象

Lambda 请求对象可以处理与您的 Lambda 函数相关的字段:

export type LambdaRequest = { operation: 'Invoke' | 'BatchInvoke'; invocationType?: 'RequestResponse' | 'Event'; payload: unknown; };

以下示例使用了一个 invoke 操作,其有效载荷数据是 GraphQL 架构中的 getPost 字段以及来自上下文的参数:

export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }

整个映射文档作为输入传递给您的 Lambda 函数,因此,上一示例现在如下所示:

{ "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "input": { "id": "postId1", } } } }

操作

Lambda 数据来源允许您在 operation 字段中定义两个操作:InvokeBatchInvokeInvoke 操作让 AWS AppSync 知道为每个 GraphQL 字段解析器调用您的 Lambda 函数。BatchInvoke 指示 AWS AppSync 批处理当前 GraphQL 字段的请求。operation 字段为必填项。

对于 Invoke,解析的请求与 Lambda 函数的输入有效载荷匹配。我们来修改上面的示例:

export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }

这已解析并传递给 Lambda 函数,可能如下所示:

{ "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }

对于 BatchInvoke,请求应用于批次中的每个字段解析器。为了简洁起见,AWS AppSync 将所有请求 payload 值合并到与请求对象匹配的单个对象下面的一个列表中。以下示例请求处理程序显示了合并:

export function request(ctx) { return { operation: 'Invoke', payload: ctx, }; }

将评估该请求并解析为以下映射文档:

{ "operation": "BatchInvoke", "payload": [ {...}, // context for batch item 1 {...}, // context for batch item 2 {...} // context for batch item 3 ] }

payload 列表的每个元素对应于一个批处理项目。Lambda 函数也预期返回列表形状的响应,并与请求中发送的项目顺序匹配:

[ { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1 { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2 { "data": {...}, "errorMessage": null, "errorType": null } // result for batch item 3 ]

有效负载

payload 字段是一个容器,用于将任何数据传递给 Lambda 函数。如果 operation 字段设置为 BatchInvoke,则 AWS AppSync 将现有 payload 值包装到一个列表中。payload 字段为可选项。

调用类型

Lambda 数据来源让您可以定义两个调用类型:RequestResponseEvent。这些调用类型等同于 Lambda API 中定义的调用类型。RequestResponse 调用类型让 AWS AppSync 可以同步调用您的 Lambda 函数以等待响应。Event 调用让您可以异步调用 Lambda 函数。有关 Lambda 如何处理 Event 调用类型请求的更多信息,请参阅异步调用invocationType 字段为可选项。如果请求中未包含此字段,AWS AppSync 将默认为 RequestResponse 调用类型。

对于任何 invocationType 字段,解析的请求与 Lambda 函数的输入有效载荷匹配。我们来修改上面的示例:

export function request(ctx) { return { operation: 'Invoke', invocationType: 'Event', payload: { field: 'getPost', arguments: ctx.args }, }; }

这已解析并传递给 Lambda 函数,可能如下所示:

{ "operation": "Invoke", "invocationType": "Event", "payload": { "arguments": { "id": "postId1" } } }

BatchInvoke 操作与 Event 调用类型字段结合使用时,AWS AppSync 会以上述相同的方式合并字段解析器,并将请求作为异步事件传递给您的 Lambda 函数,其中 payload 是一个值列表。来自 Event 调用类型请求的响应会生成一个没有响应处理程序的 null 值:

{ "data": { "field": null } }

建议您对 Event 调用类型解析器禁用解析器缓存,因为如果出现缓存命中,这些解析器不会发送到 Lambda。

响应对象

与其他数据来源一样,您的 Lambda 函数向 AWS AppSync 发送响应,该响应必须转换为 GraphQL 类型。Lambda 函数的结果包含在 context 结果属性(context.result)中。

如果 Lambda 函数响应形状与 GraphQL 类型形状匹配,您可以使用以下函数响应处理程序转发响应:

export function response(ctx) { return ctx.result }

没有适用于响应对象的必填字段或形状限制。不过,由于 GraphQL 是强类型的,因此,解析的响应必须与预期的 GraphQL 类型匹配。

Lambda 函数批处理的响应

如果 operation 字段设置为 BatchInvoke,AWS AppSync 需要从 Lambda 函数返回一个项目列表。要让 AWS AppSync 将每个结果映射回原始请求项目,响应列表的大小和顺序必须匹配。可以在响应列表中包含 null 项目;ctx.result 相应地设置为 null