本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS AppSync JavaScript Lambda 的解析器函数参考
您可以使用 AWS AppSync 函数和解析器来调用位于您账户中的 Lambda 函数。在将请求负载和 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
,请求将应用于批次中的每个字段解析器。为简洁起见,将所有请求payload
值 AWS 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
,则 AWS AppSync 将现有payload
值换成一个列表。payload
字段为可选项。
调用类型
Lambda 数据源允许您定义两种调用类型:和。RequestResponse
Event
调用类型与 Lambda 中定义的调用类型同义。APIRequestResponse
调用类型允许 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 函数发送的响应必须转换为 GraphQL 类型。 AWS AppSync 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。