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

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

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

您可以使用 Amazon 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 字段中定义两个操作:InvokeBatchInvoke。该Invoke操作允许 Amazon AppSync 你为每个 GraphQL 字段解析器调用你的 Lambda 函数。 BatchInvoke指示 Amazon 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,请求应用于批次中的每个字段解析器。为简洁起见,将所有请求payload值 Amazon AppSync 合并到与请求对象匹配的单个对象下的列表中。以下示例请求处理程序显示了合并:

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,则 Amazon AppSync 将现有payload值换成一个列表。payload 字段为可选项。

调用类型

Lambda 数据来源让您可以定义两个调用类型:RequestResponseEvent。这些调用类型等同于 Lambda API 中定义的调用类型。RequestResponse调用类型允许 Amazon AppSync 同步调用您的 Lambda 函数以等待响应。Event 调用让您可以异步调用 Lambda 函数。有关 Lambda 如何处理 Event 调用类型请求的更多信息,请参阅异步调用invocationType 字段为可选项。如果请求中未包含此字段, Amazon 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调用类型字段结合使用时,将以与上述相同的方式 Amazon AppSync 合并字段解析器,然后将请求作为异步事件传递给您的 Lambda 函数,并以值列表的形式传送给您的 Lambda 函数。payload来自 Event 调用类型请求的响应会生成一个没有响应处理程序的 null 值:

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

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

响应对象

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

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

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

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

Lambda 函数批处理的响应

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