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

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

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和。BatchInvokeInvoke操作允许 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