

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS AppSync JavaScript リゾルバーの概要
<a name="resolver-reference-overview-js"></a>

AWS AppSync では、データソースに対してオペレーションを実行して GraphQL リクエストに応答できます。クエリ、ミューテーション、サブスクリプションなど、実行する GraphQL フィールドごとに、リゾルバーをアタッチする必要があります。

リゾルバーは GraphQL とデータソースの間のコネクタです。受信した GraphQL リクエストをバックエンドデータソースの手順に変換する方法と、そのデータソースからのレスポンスを GraphQL レスポンスに変換する方法を AWS AppSync に伝えます。 AWS AppSync を使用すると、JavaScript を使用してリゾルバーを記述し、 AWS AppSync (`APPSYNC_JS`) 環境で実行できます。

AWS AppSync では、パイプライン内の複数の AWS AppSync 関数で構成されるユニットリゾルバーまたはパイプラインリゾルバーを記述できます。

## サポートされているランタイム機能
<a name="runtime-support-js"></a>

 AWS AppSync JavaScript ランタイムは、JavaScript ライブラリ、ユーティリティ、機能のサブセットを提供します。`APPSYNC_JS` ランタイムでサポートされている特徴と機能の完全なリストについては、「[リゾルバーと関数用の JavaScript ランタイム機能](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html)」を参照してください。

## ユニットリゾルバー
<a name="unit-resolver-js"></a>

ユニットリゾルバーは、データソースに対して実行されるリクエストハンドラーとレスポンスハンドラーを定義するコードで構成されています。リクエストハンドラーはコンテキストオブジェクトを引数として受け取り、データソースの呼び出しに使用されたリクエストペイロードを返します。レスポンスハンドラーは、実行されたリクエストの結果を含むペイロードをデータソースから受け取ります。レスポンスハンドラーは、ペイロードを GraphQL レスポンスに変換して GraphQL フィールドを解決します。以下の例では、リゾルバーは DynamoDB データソースから項目を取得します。

```
import * as ddb from '@aws-appsync/utils/dynamodb'

export function request(ctx) {
  return ddb.get({ key: { id: ctx.args.id } });
}

export const response = (ctx) => ctx.result;
```

## JavaScript パイプラインリゾルバーの仕組み
<a name="anatomy-of-a-pipeline-resolver-js"></a>

パイプラインリゾルバーは、リクエストとレスポンスのハンドラーと関数のリストを定義するコードで構成されています。各関数には、データソースに対して実行される**リクエスト**および**レスポンス**ハンドラーがあります。パイプラインリゾルバーは実行をリスト内の関数に委任するため、いずれのデータソースにもリンクされていません。ユニットリゾルバーと関数は、データソースに対してオペレーションを実行するプリミティブです。

### パイプラインリゾルバーリクエストハンドラー
<a name="request-handler-js"></a>

パイプラインリゾルバーのリクエストハンドラー (before step) では、定義した関数を実行する前に準備ロジックを実行できます。

### 関数のリスト
<a name="functions-list-js"></a>

パイプラインリゾルバーが順番に実行する関数のリスト。パイプラインリゾルバーのリクエストハンドラーの評価結果は、最初の関数で `ctx.prev.result` として使用可能になります。各関数の評価結果は、以下の関数で `ctx.prev.result` として使用可能です。

### パイプラインリゾルバーレスポンスハンドラー
<a name="response-handler-js"></a>

パイプラインリゾルバーのレスポンスハンドラーでは、最後の関数の出力から、想定される GraphQL フィールドタイプへの、一部の最終的なロジックを実行できます。関数のリストの最後にある関数の出力は、パイプラインリゾルバーレスポンスハンドラーで `ctx.prev.result` または `ctx.result` として使用可能です。

### 実行フロー
<a name="execution-flow-js"></a>

2 つの関数で構成されるパイプラインリゾルバーがあるとします。以下のリストでは、リゾルバーが呼び出されたときの実行フローを表しています。

1.  パイプラインリゾルバーリクエストハンドラー

1.  関数 1: 関数リクエストハンドラー 

1.  関数 1: データソースの呼び出し 

1.  関数 1: 関数レスポンスハンドラー 

1.  関数 2: 関数リクエストハンドラー 

1.  関数 2: データソースの呼び出し 

1.  関数 2: 関数レスポンスハンドラー 

1.  パイプラインリゾルバーレスポンスハンドラー 

![](http://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/images/appsync-js-resolver-logic.png)


### 便利な `APPSYNC_JS` ランタイムビルトインユーティリティ
<a name="useful-utilities-js"></a>

パイプラインリゾルバーでの作業には、以下のユーティリティが役立ちます。

#### ctx.stash
<a name="ctx-stash-js"></a>

stash は、各リゾルバー、関数リクエスト、レスポンスハンドラー内で使用できるオブジェクトです。同じ stash インスタンスは 1 つのリゾルバーの実行を通して存続します。つまり、stash を使用して、リクエストとレスポンスのハンドラー間、およびパイプラインリゾルバーの関数間で、任意のデータを渡すことができます。stash は通常の JavaScript オブジェクトと同じようにテストできます。

#### ctx.prev.result
<a name="ctx-prev-result-js"></a>

`ctx.prev.result` は、パイプラインで実行された前のオペレーションの結果を表します。前のオペレーションがパイプラインリゾルバーリクエストハンドラーであった場合、`ctx.prev.result` はチェーン内の最初の関数に使用可能になります。前のオペレーションが最初の関数であった場合、`ctx.prev.result` は最初の関数の出力を表し、パイプライン内の 2 番目の関数に使用可能になります。前のオペレーションが最後の関数であった場合、`ctx.prev.result` は最後の関数の出力を表し、パイプラインリゾルバーレスポンスハンドラーに使用可能になります。

#### util.error
<a name="util-error-js"></a>

`util.error` ユーティリティはフィールドエラーをスローするのに便利です。関数リクエストまたはレスポンスハンドラー内で `util.error` を使用すると、フィールドエラーがすぐにスローされ、それ以降の関数が実行されなくなります。詳細やその他の `util.error` シグネチャについては、「[リゾルバーと関数の JavaScript ランタイム機能](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html)」を参照してください。

#### util.appendError
<a name="util-appenderror-js"></a>

`util.appendError` は `util.error()` と似ていますが、ハンドラーの評価を中断しないという大きな違いがあります。代わりに、フィールドにエラーがあったことを通知します。ただし、ハンドラーを評価し、データを引き続き返すことも可能です。関数内で `util.appendError` を使用しても、パイプラインの実行フローは中断されません。詳細やその他の `util.error` シグネチャについては、「[リゾルバーと関数の JavaScript ランタイム機能](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html)」を参照してください。

#### runtime.earlyReturn
<a name="runtime-earlyreturn-js"></a>

`runtime.earlyReturn` 関数を使うと、どのリクエスト関数からでも途中で戻ることができます。リゾルバーのリクエストハンドラー内で `runtime.earlyReturn` を使用すると、リゾルバーから返されます。 AWS AppSync 関数リクエストハンドラーから呼び出すと、関数から戻り、パイプライン内の次の関数またはリゾルバー応答ハンドラーのどちらかまで実行が続行されます。

### パイプラインリゾルバーの記述
<a name="writing-resolvers"></a>

パイプラインリゾルバーには、パイプライン内の関数の実行を囲むリクエストハンドラーとレスポンスハンドラーもあります。リクエストハンドラーは最初の関数のリクエストの前に実行され、レスポンスハンドラーは最後の関数の応答の後に実行されます。リゾルバーリクエストハンドラーは、パイプライン内の関数が使用するデータを設定できます。リゾルバーレスポンスハンドラーは GraphQL フィールド出力タイプにマッピングするデータを返す役割を果たします。以下の例では、リゾルバーリクエストハンドラーが `allowedGroups` を定義しています。返されるデータはこれらのグループのいずれかに属している必要があります。この値は、リゾルバーの関数がデータをリクエストする際に使用できます。リゾルバーのレスポンスハンドラーは最終チェックを行い、結果をフィルタリングして、許可されたグループに属するアイテムだけが返されるようにします。

```
import { util } from '@aws-appsync/utils';

/**
 * Called before the request function of the first AppSync function in the pipeline.
 *  @param ctx the context object holds contextual information about the function invocation.
 */
export function request(ctx) {
  ctx.stash.allowedGroups = ['admin'];
  ctx.stash.startedAt = util.time.nowISO8601();
  return {};
}
/**
 * Called after the response function of the last AppSync function in the pipeline.
 * @param ctx the context object holds contextual information about the function invocation.
 */
export function response(ctx) {
  const result = [];
  for (const item of ctx.prev.result) {
    if (ctx.stash.allowedGroups.indexOf(item.group) > -1) result.push(item);
  }
  return result;
}
```

#### AWS AppSync 関数の記述
<a name="writing-functions"></a>

AWS AppSync 関数を使用すると、スキーマ内の複数のリゾルバー間で再利用できる一般的なロジックを記述できます。例えば、Amazon DynamoDB データソースからの項目のクエリを担当する `QUERY_ITEMS` という名前の one AWS AppSync 関数を使用できます。項目をクエリするリゾルバーについては、リゾルバーのパイプラインに関数を追加し、使用するクエリインデックスを指定するだけです。ロジックを再実装する必要はありません。

## 補足トピック
<a name="supplemental-topics"></a>

**トピック**
+ [Amazon DynamoDB を使用したパイプラインリゾルバーの例](https://docs.aws.amazon.com/appsync/latest/devguide/writing-code.html)
+ [`APPSYNC_JS` ランタイムのユーティリティの設定](https://docs.aws.amazon.com/appsync/latest/devguide/utility-resolvers.html)
+ [`APPSYNC_JS` ランタイムのバンドル、TypeScript、ソースマップ](https://docs.aws.amazon.com/appsync/latest/devguide/additional-utilities.html)
+ [リゾルバーと関数ハンドラーのテスト](https://docs.aws.amazon.com/appsync/latest/devguide/test-resolvers.html)
+ [VTL から JavaScript への移行](https://docs.aws.amazon.com/appsync/latest/devguide/migrating-resolvers.html)
+ [データソースへの直接アクセスと Lambda データソース経由のプロキシのどちらかを選択する](https://docs.aws.amazon.com/appsync/latest/devguide/choosing-data-source.html)