本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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
字段中定义两个操作:Invoke
和 BatchInvoke
。Invoke
操作让 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 数据来源让您可以定义两个调用类型:RequestResponse
和 Event
。这些调用类型等同于 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。