

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

# AWS AppSync JavaScript Lambda 的解析器函数参考
<a name="resolver-reference-lambda-js"></a>

您可以使用 AWS AppSync 函数和解析器来调用位于您账户中的 Lambda 函数。您可以在将请求有效载荷和 Lambda 函数响应返回给客户端之前对其进行调整。您还可以指定在请求对象中执行的操作类型。本节介绍了支持的 Lambda 操作的请求。

## 请求对象
<a name="request-object-js"></a>

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",
      }
    }
  }
}
```

### 操作
<a name="operation-js"></a>

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
]
```

### 有效载荷
<a name="payload-js"></a>

`payload` 字段是一个容器，用于将任何数据传递给 Lambda 函数。如果该`operation`字段设置为`BatchInvoke`，则 AWS AppSync 将现有`payload`值换成一个列表。`payload` 字段为可选项。

### 调用类型
<a name="async-invocation-type-js"></a>

Lambda 数据来源让您可以定义两个调用类型：`RequestResponse` 和 `Event`。这些调用类型等同于 [Lambda API](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) 中定义的调用类型。`RequestResponse`调用类型允许 AWS AppSync 同步调用您的 Lambda 函数以等待响应。`Event` 调用让您可以异步调用 Lambda 函数。有关 Lambda 如何处理 `Event` 调用类型请求的更多信息，请参阅[异步调用](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html)。`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 函数，并以值列表的形式传送给您的 Lambda 函数。`payload`来自 `Event` 调用类型请求的响应会生成一个没有响应处理程序的 `null` 值：

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

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

## 响应对象
<a name="response-object-js"></a>

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

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

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

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

## Lambda 函数批处理的响应
<a name="aws-appsync-resolver-reference-lambda-batched-response-js"></a>

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