

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lambda 的AWS AppSync JavaScript 解析程式函數參考
<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` 操作 lets AWS AppSync 知道 會為每個 GraphQL 欄位解析程式呼叫 Lambda 函數。`BatchInvoke`instructs 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
]
```

### 酬載
<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` 叫用類型 lets 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 函數，而 `payload`為值清單。`Event` 呼叫類型請求的回應會產生沒有回應處理常式`null`的值：

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

我們建議您停用`Event`呼叫類型解析程式的解析程式快取，因為如果有快取命中，這些解析程式不會傳送至 Lambda。

## 回應物件
<a name="response-object-js"></a>

如同其他資料來源，您的 Lambda 函數會將回應傳送至 AWS AppSync，該回應必須轉換為 GraphQL 類型。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*。