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

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

JavaScript Lambda 的解析器函数参考

您可以使用 Amazon 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操作允许 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 数据源允许您定义两种调用类型:和。RequestResponse Event调用类型与 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