

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengkonfigurasi resolver di AWS AppSync
<a name="resolver-config-overview"></a>

Di bagian sebelumnya, Anda mempelajari cara membuat skema GraphQL dan sumber data, lalu menghubungkannya bersama dalam layanan. AWS AppSync Dalam skema Anda, Anda mungkin telah menetapkan satu atau beberapa bidang (operasi) dalam kueri dan mutasi Anda. Sementara skema menggambarkan jenis data yang akan diminta operasi dari sumber data, skema tersebut tidak pernah menerapkan bagaimana operasi tersebut akan berperilaku di sekitar data. 

Perilaku operasi selalu diimplementasikan dalam resolver, yang akan dikaitkan dengan bidang yang melakukan operasi. Untuk informasi selengkapnya tentang cara kerja resolver secara umum, lihat halaman [Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html).

Di AWS AppSync, resolver Anda terkait dengan runtime, yang merupakan lingkungan di mana resolver Anda mengeksekusi. Runtime mendikte bahasa tempat resolver Anda akan ditulis. Saat ini ada dua runtime yang didukung: APPSYNC\$1JS (JavaScript) dan Apache Velocity Template Language (VTL). 

Saat menerapkan resolver, ada struktur umum yang mereka ikuti:
+ **Sebelum langkah**: Ketika permintaan dibuat oleh klien, resolver untuk bidang skema yang digunakan (biasanya kueri, mutasi, langganan Anda) diteruskan data permintaan. Penyelesai akan mulai memproses data permintaan dengan penangan langkah sebelum, yang memungkinkan beberapa operasi pra-pemrosesan dilakukan sebelum data bergerak melalui resolver.
+ **Fungsi**: Setelah langkah sebelum berjalan, permintaan diteruskan ke daftar fungsi. Fungsi pertama dalam daftar akan dijalankan terhadap sumber data. Fungsi adalah subset dari kode resolver Anda yang berisi permintaan dan penangan responsnya sendiri. Handler permintaan akan mengambil data permintaan dan melakukan operasi terhadap sumber data. Response handler akan memproses respon sumber data sebelum meneruskannya kembali ke daftar. Jika ada lebih dari satu fungsi, data permintaan akan dikirim ke fungsi berikutnya dalam daftar yang akan dieksekusi. Fungsi dalam daftar akan dijalankan secara serial dalam urutan yang ditentukan oleh pengembang. Setelah semua fungsi dieksekusi, hasil akhir diteruskan ke langkah setelahnya.
+ **Langkah setelah: Langkah** setelah adalah fungsi handler yang memungkinkan Anda melakukan beberapa operasi akhir pada respons fungsi akhir sebelum meneruskannya ke respons GraphQL.

Aliran ini adalah contoh dari resolver pipa. Resolver pipeline didukung di kedua runtime. Namun, ini adalah penjelasan yang disederhanakan tentang apa yang dapat dilakukan oleh penyelesai pipa. Juga, kami hanya menjelaskan satu konfigurasi resolver yang mungkin. [Untuk informasi selengkapnya tentang konfigurasi resolver yang didukung, lihat ikhtisar resolver untuk APPSYNC\$1JS atau [ikhtisar template pemetaan JavaScript Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html) untuk VTL.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-overview.html)

Seperti yang Anda lihat, resolver bersifat modular. Agar komponen resolver berfungsi dengan baik, mereka harus dapat mengintip ke dalam keadaan eksekusi dari komponen lain. Dari bagian [Resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html), Anda tahu bahwa setiap komponen dalam resolver dapat diteruskan informasi penting tentang status eksekusi sebagai satu set argumen (`args`,`context`, dll.). Dalam AWS AppSync, ini ditangani secara ketat oleh. `context` Ini adalah wadah untuk informasi tentang bidang yang sedang diselesaikan. Ini dapat mencakup semuanya mulai dari argumen yang diteruskan, hasil, data otorisasi, data header, dll. Untuk informasi lebih lanjut tentang konteksnya, lihat [referensi objek konteks Resolver untuk APPSYNC\$1JS atau referensi](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) konteks template pemetaan [Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html) untuk VTL.

Konteksnya bukan satu-satunya alat yang dapat Anda gunakan untuk mengimplementasikan resolver Anda. AWS AppSync mendukung berbagai utilitas untuk menghasilkan nilai, penanganan kesalahan, penguraian, konversi, dll. [Anda dapat melihat daftar utilitas [di sini](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) untuk APPSYNC\$1JS atau di sini untuk VTL.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html)

Di bagian berikut, Anda akan mempelajari cara mengonfigurasi resolver di GraphQL API Anda.

**Topics**
+ [Membuat query dasar () JavaScript](configuring-resolvers-js.md)
+ [Membuat kueri dasar (VTL)](configuring-resolvers.md)

# Membuat query dasar () JavaScript
<a name="configuring-resolvers-js"></a>

GraphQL resolver menghubungkan bidang dalam skema tipe ke sumber data. Resolver adalah mekanisme dimana permintaan dipenuhi.

Resolver AWS AppSync digunakan JavaScript untuk mengonversi ekspresi GraphQL menjadi format yang dapat digunakan sumber data. Atau, template pemetaan dapat ditulis dalam [Apache Velocity Template Language (VTL) untuk](https://velocity.apache.org/engine/2.0/vtl-reference.html) mengubah ekspresi GraphQL menjadi format yang dapat digunakan sumber data.

Bagian ini menjelaskan cara mengkonfigurasi resolver menggunakan. JavaScript Bagian tutorial [Resolver (JavaScript) menyediakan tutorial](https://docs.aws.amazon.com/appsync/latest/devguide/tutorials-js.html) mendalam tentang cara menerapkan resolver menggunakan. JavaScript Bagian [Referensi Resolver (JavaScript)](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html) memberikan penjelasan tentang operasi utilitas yang dapat digunakan dengan JavaScript resolver.

Sebaiknya ikuti panduan ini sebelum mencoba menggunakan salah satu tutorial yang disebutkan di atas.

Di bagian ini, kita akan membahas cara membuat dan mengkonfigurasi resolver untuk kueri dan mutasi.

**catatan**  
Panduan ini mengasumsikan Anda telah membuat skema Anda dan memiliki setidaknya satu kueri atau mutasi. Jika Anda mencari langganan (data waktu nyata), lihat panduan [ini](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html).

Di bagian ini, kami akan memberikan beberapa langkah umum untuk mengonfigurasi resolver bersama dengan contoh yang menggunakan skema di bawah ini:

```
// schema.graphql file

input CreatePostInput {
  title: String
  date: AWSDateTime
}

type Post {
  id: ID!
  title: String
  date: AWSDateTime
}

type Mutation {
  createPost(input: CreatePostInput!): Post
}

type Query {
  getPost: [Post]
}
```

## Membuat resolver kueri dasar
<a name="create-basic-query-resolver-js"></a>

Bagian ini akan menunjukkan cara membuat resolver kueri dasar.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Masukkan detail skema dan sumber data Anda. Lihat bagian [Merancang skema Anda](https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html) dan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html) untuk informasi selengkapnya.

1. Di sebelah editor **Skema**, Ada jendela bernama **Resolvers**. Kotak ini berisi daftar jenis dan bidang seperti yang didefinisikan di jendela **Skema** Anda. Anda dapat melampirkan resolver ke bidang. Anda kemungkinan besar akan melampirkan resolver ke operasi lapangan Anda. Pada bagian ini, kita akan melihat konfigurasi query sederhana. Di bawah Jenis **kueri**, pilih **Lampirkan** di sebelah bidang kueri Anda.

1. Pada halaman **Attach resolver**, di bawah **jenis Resolver, Anda dapat memilih antara pipeline atau resolver** unit. Untuk informasi selengkapnya tentang jenis ini, lihat [Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html). Panduan ini akan memanfaatkan`pipeline resolvers`.
**Tip**  
Saat membuat resolver pipeline, sumber data Anda akan dilampirkan ke fungsi pipeline. Fungsi dibuat setelah Anda membuat resolver pipeline itu sendiri, itulah sebabnya tidak ada opsi untuk mengaturnya di halaman ini. Jika Anda menggunakan resolver unit, sumber data terikat langsung ke resolver, jadi Anda akan mengaturnya di halaman ini.

   Untuk **runtime Resolver, pilih `APPSYNC_JS` untuk mengaktifkan runtime**. JavaScript 

1. Anda dapat mengaktifkan [caching](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html) untuk API ini. Sebaiknya matikan fitur ini untuk saat ini. Pilih **Buat**.

1. Pada halaman **Edit resolver**, ada editor kode bernama kode **Resolver** yang memungkinkan Anda mengimplementasikan logika untuk penangan dan respons resolver (sebelum dan sesudah langkah). Untuk informasi selengkapnya, lihat ikhtisar [JavaScriptresolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html). 
**catatan**  
Dalam contoh kita, kita hanya akan membiarkan permintaan kosong dan respons ditetapkan untuk mengembalikan hasil sumber data terakhir dari [konteks](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html):  

   ```
   import {util} from '@aws-appsync/utils';
   
   export function request(ctx) {
       return {};
   }
   
   export function response(ctx) {
       return ctx.prev.result;
   }
   ```

   Di bawah bagian ini, ada tabel yang disebut **Functions**. Fungsi memungkinkan Anda untuk menerapkan kode yang dapat digunakan kembali di beberapa resolver. Alih-alih terus-menerus menulis ulang atau menyalin kode, Anda dapat menyimpan kode sumber sebagai fungsi untuk ditambahkan ke resolver kapan pun Anda membutuhkannya. 

   Fungsi membentuk sebagian besar daftar operasi pipa. Saat menggunakan beberapa fungsi dalam resolver, Anda mengatur urutan fungsi, dan mereka akan dijalankan dalam urutan itu secara berurutan. Mereka dieksekusi setelah fungsi permintaan berjalan dan sebelum fungsi respon dimulai.

   Untuk menambahkan fungsi baru, di bawah **Fungsi**, pilih **Tambah fungsi**, lalu **Buat fungsi baru**. Atau, Anda mungkin melihat tombol **Create function** untuk memilih sebagai gantinya.

   1. Pilih sumber data. Ini akan menjadi sumber data tempat resolver bertindak.
**catatan**  
Dalam contoh kita, kita melampirkan resolver untuk`getPost`, yang mengambil objek oleh. `Post` `id` Mari kita asumsikan kita sudah menyiapkan tabel DynamoDB untuk skema ini. Kunci partisi diatur ke `id` dan kosong.

   1. Masukkan a`Function name`.

   1. Di bawah **kode Fungsi**, Anda harus mengimplementasikan perilaku fungsi. Ini mungkin membingungkan, tetapi setiap fungsi akan memiliki permintaan lokal dan penangan respons sendiri. Permintaan berjalan, kemudian pemanggilan sumber data dibuat untuk menangani permintaan, kemudian respons sumber data diproses oleh penangan respons. Hasilnya disimpan dalam objek [konteks](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html). Setelah itu, fungsi berikutnya dalam daftar akan berjalan atau akan diteruskan ke penangan respons langkah setelah jika itu yang terakhir. 
**catatan**  
Dalam contoh kita, kita melampirkan resolver ke`getPost`, yang mendapat daftar `Post` objek dari sumber data. Fungsi permintaan kami akan meminta data dari tabel kami, tabel akan meneruskan responsnya ke konteks (ctx), maka respons akan mengembalikan hasilnya dalam konteks. AWS AppSync Kekuatan terletak pada keterkaitannya dengan layanan lain. AWS Karena kami menggunakan DynamoDB, kami memiliki [serangkaian operasi untuk menyederhanakan hal-hal](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html) seperti ini. Kami memiliki beberapa contoh boilerplate untuk tipe sumber data lainnya juga.  
Kode kita akan terlihat seperti ini:  

      ```
      import { util } from '@aws-appsync/utils';
      
      /**
       * Performs a scan on the dynamodb data source
       */
      export function request(ctx) {
        return { operation: 'Scan' };
      }
      
      /**
       * return a list of scanned post items
       */
      export function response(ctx) {
        return ctx.result.items;
      }
      ```
Pada langkah ini, kami menambahkan dua fungsi:  
`request`: Handler permintaan melakukan operasi pengambilan terhadap sumber data. Argumen berisi objek konteks (`ctx`), atau beberapa data yang tersedia untuk semua resolver melakukan operasi tertentu. Misalnya, mungkin berisi data otorisasi, nama bidang yang diselesaikan, dll. Pernyataan pengembalian melakukan [https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan](https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan)operasi (lihat [di sini](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html) untuk contoh). Karena kami bekerja dengan DynamoDB, kami diizinkan untuk menggunakan beberapa operasi dari layanan itu. Pemindaian melakukan pengambilan dasar semua item di tabel kami. Hasil operasi ini disimpan dalam objek konteks sebagai `result` wadah sebelum diteruskan ke handler respons. `request`Dijalankan sebelum respons dalam pipa.
`response`: Response handler yang mengembalikan output dari. `request` Argumennya adalah objek konteks yang diperbarui, dan pernyataan pengembaliannya adalah`ctx.prev.result`. Pada titik ini dalam panduan ini, Anda mungkin tidak terbiasa dengan nilai ini. `ctx`mengacu pada objek konteks. `prev`mengacu pada operasi sebelumnya dalam pipa, yang merupakan milik kami`request`. `result`Berisi hasil resolver saat bergerak melalui pipa. Jika Anda menempatkan semuanya bersama-sama, `ctx.prev.result` mengembalikan hasil dari operasi terakhir yang dilakukan, yang merupakan handler permintaan.

   1. Pilih **Buat** setelah selesai.

1. Kembali ke layar resolver, di bawah **Fungsi**, pilih drop-down **Tambah fungsi** dan tambahkan fungsi Anda ke daftar fungsi Anda.

1. Pilih **Simpan** untuk memperbarui resolver.

------
#### [ CLI ]

**Untuk menambahkan fungsi Anda**
+ Buat fungsi untuk resolver pipeline Anda menggunakan perintah. `[create-function](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-function.html)`

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. `name`Fungsi di AWS AppSync konsol.

  1. Itu`data-source-name`, atau nama sumber data yang akan digunakan fungsi. Itu harus sudah dibuat dan ditautkan ke GraphQL API Anda di layanan. AWS AppSync 

  1. atau lingkungan dan bahasa dari fungsi tersebut. `runtime` Untuk JavaScript, nama harus`APPSYNC_JS`, dan runtime,`1.0.0`.

  1. Penangan`code`, atau permintaan dan respons fungsi Anda. Meskipun Anda dapat mengetiknya secara manual, jauh lebih mudah untuk menambahkannya ke file.txt (atau format serupa) dan kemudian meneruskannya sebagai argumen. 
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Performs a scan on the dynamodb data source
      */
     export function request(ctx) {
       return { operation: 'Scan' };
     }
     
     /**
      * return a list of scanned post items
      */
     export function response(ctx) {
       return ctx.result.items;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-function \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --name get_posts_func_1 \
  --data-source-name table-for-posts \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file://~/path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "functionConfiguration": {
          "functionId": "ejglgvmcabdn7lx75ref4qeig4",
          "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/ejglgvmcabdn7lx75ref4qeig4",
          "name": "get_posts_func_1",
          "dataSourceName": "table-for-posts",
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output goes here"
      }
  }
  ```
**catatan**  
Pastikan Anda merekam `functionId` suatu tempat karena ini akan digunakan untuk melampirkan fungsi ke resolver.

**Untuk membuat resolver Anda**
+ Buat fungsi pipeline `Query` dengan menjalankan `[create-resolver](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)` perintah.

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. Jenis objek`type-name`, atau khusus dalam skema Anda (Query, Mutation, Subscription).

  1. Operasi`field-name`, atau bidang di dalam jenis objek khusus yang ingin Anda lampirkan resolver.

  1. The`kind`, yang menentukan unit atau resolver pipa. Setel ini `PIPELINE` untuk mengaktifkan fungsi pipeline.

  1. The`pipeline-config`, atau fungsi (s) untuk melampirkan ke resolver. Pastikan Anda mengetahui `functionId` nilai-nilai fungsi Anda. Urutan daftar penting.

  1. Yang`runtime`, yang `APPSYNC_JS` (JavaScript). `runtimeVersion`Saat ini adalah`1.0.0`.

  1. Itu`code`, yang berisi penangan langkah sebelum dan sesudah.
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Sends a request to `put` an item in the DynamoDB data source
      */
     export function request(ctx) {
       const { id, ...values } = ctx.args;
       return {
         operation: 'PutItem',
         key: util.dynamodb.toMapValues({ id }),
         attributeValues: util.dynamodb.toMapValues(values),
       };
     }
     
     /**
      * returns the result of the `put` operation
      */
     export function response(ctx) {
       return ctx.result;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-resolver \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --type-name Query \
  --field-name getPost \
  --kind PIPELINE \
  --pipeline-config functions=ejglgvmcabdn7lx75ref4qeig4 \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file:///path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "resolver": {
          "typeName": "Mutation",
          "fieldName": "getPost",
          "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/getPost",
          "kind": "PIPELINE",
          "pipelineConfig": {
              "functions": [
                  "ejglgvmcabdn7lx75ref4qeig4"
              ]
          },
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output goes here"
      }
  }
  ```

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Aplikasi dasar akan membutuhkan hal-hal berikut:

1. Arahan impor layanan

1. Kode skema

1. Generator sumber data

1. Kode fungsi

1. Kode penyelesai

Dari bagian [Merancang skema Anda](https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html) dan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html), kami tahu bahwa file tumpukan akan menyertakan arahan impor formulir:

```
import * as x from 'x'; # import wildcard as the 'x' keyword from 'x-service'
import {a, b, ...} from 'c'; # import {specific constructs} from 'c-service'
```

**catatan**  
Di bagian sebelumnya, kami hanya menyatakan cara AWS AppSync mengimpor konstruksi. Dalam kode nyata, Anda harus mengimpor lebih banyak layanan hanya untuk menjalankan aplikasi. Dalam contoh kami, jika kami membuat aplikasi CDK yang sangat sederhana, kami setidaknya akan mengimpor AWS AppSync layanan bersama dengan sumber data kami, yang merupakan tabel DynamoDB. Kami juga perlu mengimpor beberapa konstruksi tambahan untuk menerapkan aplikasi:  

```
import * as cdk from 'aws-cdk-lib';
import * as appsync from 'aws-cdk-lib/aws-appsync';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import { Construct } from 'constructs';
```
Untuk meringkas masing-masing:  
`import * as cdk from 'aws-cdk-lib';`: Ini memungkinkan Anda untuk menentukan aplikasi CDK dan konstruksi seperti tumpukan. Ini juga berisi beberapa fungsi utilitas yang berguna untuk aplikasi kita seperti memanipulasi metadata. Jika Anda terbiasa dengan arahan impor ini, tetapi bertanya-tanya mengapa pustaka inti cdk tidak digunakan di sini, lihat halaman [Migrasi](https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html).
`import * as appsync from 'aws-cdk-lib/aws-appsync';`: Ini mengimpor [AWS AppSync layanan](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html).
`import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';`: Ini mengimpor layanan [DynamoDB](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb-readme.html).
`import { Construct } from 'constructs';`: Kita membutuhkan ini untuk mendefinisikan [konstruksi](https://docs.aws.amazon.com/cdk/v2/guide/constructs.html) root.

Jenis impor tergantung pada layanan yang Anda panggil. Kami merekomendasikan untuk melihat dokumentasi CDK sebagai contoh. Skema di bagian atas halaman akan menjadi file terpisah di aplikasi CDK Anda sebagai `.graphql` file. Dalam file stack, kita dapat mengaitkannya dengan GraphQL baru menggunakan formulir:

```
const add_api = new appsync.GraphqlApi(this, 'graphQL-example', {
  name: 'my-first-api',
  schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema.graphql')),
});
```

**catatan**  
Dalam lingkup`add_api`, kami menambahkan API GraphQL baru menggunakan kata kunci yang diikuti `new` oleh. `appsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)` Cakupan kami adalah`this`, id CFN adalah`graphQL-example`, dan alat peraga kami adalah `my-first-api` (nama API di konsol) dan `schema.graphql` (jalur absolut ke file skema).

Untuk menambahkan sumber data, pertama-tama Anda harus menambahkan sumber data ke tumpukan. Kemudian, Anda perlu mengaitkannya dengan GraphQL API menggunakan metode khusus sumber. Asosiasi akan terjadi ketika Anda membuat fungsi resolver Anda. Sementara itu, mari kita gunakan contoh dengan membuat tabel DynamoDB menggunakan: `dynamodb.Table`

```
const add_ddb_table = new dynamodb.Table(this, 'posts-table', {
  partitionKey: {
    name: 'id',
    type: dynamodb.AttributeType.STRING,
  },
});
```

**catatan**  
Jika kita menggunakan ini dalam contoh kita, kita akan menambahkan tabel DynamoDB baru dengan id CFN `posts-table` dari dan kunci partisi. `id (S)`

Selanjutnya, kita perlu mengimplementasikan resolver kita di file stack. Berikut adalah contoh kueri sederhana yang memindai semua item dalam tabel DynamoDB:

```
const add_func = new appsync.AppsyncFunction(this, 'func-get-posts', {
  name: 'get_posts_func_1',
  add_api,
  dataSource: add_api.addDynamoDbDataSource('table-for-posts', add_ddb_table),
  code: appsync.Code.fromInline(`
      export function request(ctx) {
        return { operation: 'Scan' };
      }

      export function response(ctx) {
        return ctx.result.items;
      }
  `),
  runtime: appsync.FunctionRuntime.JS_1_0_0,
});

new appsync.Resolver(this, 'pipeline-resolver-get-posts', {
  add_api,
  typeName: 'Query',
  fieldName: 'getPost',
  code: appsync.Code.fromInline(`
      export function request(ctx) {
        return {};
      }

      export function response(ctx) {
        return ctx.prev.result;
      }
 `),
  runtime: appsync.FunctionRuntime.JS_1_0_0,
  pipelineConfig: [add_func],
});
```

**catatan**  
Pertama, kami membuat fungsi yang disebut`add_func`. Urutan pembuatan ini mungkin tampak agak berlawanan dengan intuisi, tetapi Anda harus membuat fungsi di resolver pipeline Anda sebelum Anda membuat resolver itu sendiri. Sebuah fungsi mengikuti formulir:  

```
AppsyncFunction(scope: Construct, id: string, props: AppsyncFunctionProps)
```
Ruang lingkup kami adalah`this`, id CFN kami`func-get-posts`, dan alat peraga kami berisi detail fungsi yang sebenarnya. Di dalam alat peraga, kami menyertakan:  
Fungsi `name` yang akan hadir di AWS AppSync konsol (`get_posts_func_1`).
GraphQL API yang kita buat sebelumnya (). `add_api`
Sumber data; ini adalah titik di mana kita menghubungkan sumber data ke nilai GraphQL API, lalu melampirkannya ke fungsi. Kami mengambil tabel yang kami buat (`add_ddb_table`) dan melampirkannya ke GraphQL API `add_api` () menggunakan salah `GraphqlApi` satu metode (). [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.GraphqlApi.html#addwbrdynamowbrdbwbrdatawbrsourceid-table-options](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.GraphqlApi.html#addwbrdynamowbrdbwbrdatawbrsourceid-table-options) Nilai id (`table-for-posts`) adalah nama sumber data di AWS AppSync konsol. Untuk daftar metode khusus sumber, lihat halaman berikut:  
[ DynamoDbDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.DynamoDbDataSource.html) 
 [ EventBridgeDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.EventBridgeDataSource.html) 
 [ HttpDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.HttpDataSource.html) 
 [ LambdaDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.LambdaDataSource.html) 
 [ NoneDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.NoneDataSource.html) 
 [ OpenSearchDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.OpenSearchDataSource.html) 
 [ RdsDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.RdsDataSource.html) 
Kode berisi permintaan fungsi dan penangan respons, yang merupakan pemindaian dan pengembalian sederhana.
Runtime menentukan bahwa kita ingin menggunakan APPSYNC\$1JS runtime versi 1.0.0. Perhatikan bahwa saat ini satu-satunya versi yang tersedia untuk APPSYNC\$1JS.
Selanjutnya, kita perlu melampirkan fungsi ke resolver pipa. Kami membuat resolver kami menggunakan formulir:  

```
Resolver(scope: Construct, id: string, props: ResolverProps)
```
Ruang lingkup kami adalah`this`, id CFN kami`pipeline-resolver-get-posts`, dan alat peraga kami berisi detail fungsi yang sebenarnya. Di dalam alat peraga, kami menyertakan:  
GraphQL API yang kita buat sebelumnya (). `add_api`
Nama tipe objek khusus; ini adalah operasi query, jadi kita hanya menambahkan nilai`Query`.
Nama bidang (`getPost`) adalah nama bidang dalam skema di bawah `Query` tipe.
Kode berisi penangan sebelum dan sesudah Anda. Contoh kami hanya mengembalikan hasil apa pun yang ada dalam konteks setelah fungsi melakukan operasinya.
Runtime menentukan bahwa kita ingin menggunakan APPSYNC\$1JS runtime versi 1.0.0. Perhatikan bahwa saat ini satu-satunya versi yang tersedia untuk APPSYNC\$1JS.
Konfigurasi pipeline berisi referensi ke fungsi yang kita buat (`add_func`).

------

Untuk meringkas apa yang terjadi dalam contoh ini, Anda melihat AWS AppSync fungsi yang menerapkan permintaan dan penangan respons. Fungsi ini bertanggung jawab untuk berinteraksi dengan sumber data Anda. Handler permintaan mengirim `Scan` operasi ke AWS AppSync, menginstruksikannya tentang operasi apa yang harus dilakukan terhadap sumber data DynamoDB Anda. Response handler mengembalikan daftar item (`ctx.result.items`). Daftar item kemudian dipetakan ke tipe `Post` GraphQL secara otomatis. 

## Membuat resolver mutasi dasar
<a name="creating-basic-mutation-resolvers-js"></a>

Bagian ini akan menunjukkan cara membuat resolver mutasi dasar.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di bawah bagian **Resolvers** dan jenis **Mutasi**, pilih **Lampirkan di sebelah bidang** Anda.
**catatan**  
Dalam contoh kita, kita melampirkan resolver untuk`createPost`, yang menambahkan `Post` objek ke tabel kita. Mari kita asumsikan kita menggunakan tabel DynamoDB yang sama dari bagian terakhir. Kunci partisi diatur ke `id` dan kosong.

1. Pada halaman **Attach resolver**, di bawah jenis **Resolver**, pilih. `pipeline resolvers` [Sebagai pengingat, Anda dapat menemukan informasi lebih lanjut tentang resolver di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html) Untuk **runtime Resolver, pilih `APPSYNC_JS` untuk mengaktifkan runtime**. JavaScript 

1. Anda dapat mengaktifkan [caching](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html) untuk API ini. Sebaiknya matikan fitur ini untuk saat ini. Pilih **Buat**.

1. Pilih **Tambah fungsi**, lalu pilih **Buat fungsi baru**. Atau, Anda mungkin melihat tombol **Create function** untuk memilih sebagai gantinya.

   1. Pilih sumber data Anda. Ini harus menjadi sumber yang datanya akan Anda manipulasi dengan mutasi.

   1. Masukkan a`Function name`.

   1. Di bawah **kode Fungsi**, Anda harus mengimplementasikan perilaku fungsi. Ini adalah mutasi, jadi permintaan idealnya akan melakukan beberapa operasi perubahan status pada sumber data yang dipanggil. Hasilnya akan diproses oleh fungsi respons.
**catatan**  
`createPost`menambahkan, atau “menempatkan”, yang baru `Post` dalam tabel dengan parameter kami sebagai data. Kita bisa menambahkan sesuatu seperti ini:   

      ```
      import { util } from '@aws-appsync/utils';
      
      /**
       * Sends a request to `put` an item in the DynamoDB data source
       */
      export function request(ctx) {
        return {
          operation: 'PutItem',
          key: util.dynamodb.toMapValues({id: util.autoId()}),
          attributeValues: util.dynamodb.toMapValues(ctx.args.input),
        };
      }
      
      /**
       * returns the result of the `put` operation
       */
      export function response(ctx) {
        return ctx.result;
      }
      ```
Pada langkah ini, kami juga menambahkan `request` dan `response` berfungsi:  
`request`: Handler permintaan menerima konteks sebagai argumen. Pernyataan pengembalian request handler melakukan [https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem](https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem)perintah, yang merupakan operasi DynamoDB bawaan ([lihat](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-2.html) di sini [atau](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.WritingData) di sini untuk contoh). `PutItem`Perintah menambahkan `Post` objek ke tabel DynamoDB kami dengan mengambil nilai `key` partisi (dihasilkan secara otomatis `util.autoid()` oleh) `attributes` dan dari input argumen konteks (ini adalah nilai yang akan kami berikan dalam permintaan kami). `key`Itu adalah `id` dan `attributes` adalah argumen `title` lapangan `date` dan. Keduanya diformat sebelumnya melalui [https://docs.aws.amazon.com//appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html#utility-helpers-in-toMap-js](https://docs.aws.amazon.com//appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html#utility-helpers-in-toMap-js)helper untuk bekerja dengan tabel DynamoDB.
`response`: Respons menerima konteks yang diperbarui dan mengembalikan hasil penangan permintaan.

   1. Pilih **Buat** setelah selesai.

1. Kembali ke layar resolver, di bawah **Fungsi**, pilih drop-down **Tambah fungsi** dan tambahkan fungsi Anda ke daftar fungsi Anda.

1. Pilih **Simpan** untuk memperbarui resolver.

------
#### [ CLI ]

**Untuk menambahkan fungsi Anda**
+ Buat fungsi untuk resolver pipeline Anda menggunakan perintah. `[create-function](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-function.html)`

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. `name`Fungsi di AWS AppSync konsol.

  1. Itu`data-source-name`, atau nama sumber data yang akan digunakan fungsi. Itu harus sudah dibuat dan ditautkan ke GraphQL API Anda di layanan. AWS AppSync 

  1. atau lingkungan dan bahasa dari fungsi tersebut. `runtime` Untuk JavaScript, nama harus`APPSYNC_JS`, dan runtime,`1.0.0`.

  1. Penangan`code`, atau permintaan dan respons fungsi Anda. Meskipun Anda dapat mengetiknya secara manual, jauh lebih mudah untuk menambahkannya ke file.txt (atau format serupa) kemudian meneruskannya sebagai argumen. 
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Sends a request to `put` an item in the DynamoDB data source
      */
     export function request(ctx) {
       return {
         operation: 'PutItem',
         key: util.dynamodb.toMapValues({id: util.autoId()}),
         attributeValues: util.dynamodb.toMapValues(ctx.args.input),
       };
     }
     
     /**
      * returns the result of the `put` operation
      */
     export function response(ctx) {
       return ctx.result;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-function \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --name add_posts_func_1 \
  --data-source-name table-for-posts \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file:///path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "functionConfiguration": {
          "functionId": "vulcmbfcxffiram63psb4dduoa",
          "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/vulcmbfcxffiram63psb4dduoa",
          "name": "add_posts_func_1",
          "dataSourceName": "table-for-posts",
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output foes here"
      }
  }
  ```
**catatan**  
Pastikan Anda merekam `functionId` suatu tempat karena ini akan digunakan untuk melampirkan fungsi ke resolver.

**Untuk membuat resolver Anda**
+ Buat fungsi pipeline `Mutation` dengan menjalankan `[create-resolver](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)` perintah.

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. Jenis objek`type-name`, atau khusus dalam skema Anda (Query, Mutation, Subscription).

  1. Operasi`field-name`, atau bidang di dalam jenis objek khusus yang ingin Anda lampirkan resolver.

  1. The`kind`, yang menentukan unit atau resolver pipa. Setel ini `PIPELINE` untuk mengaktifkan fungsi pipeline.

  1. The`pipeline-config`, atau fungsi (s) untuk melampirkan ke resolver. Pastikan Anda mengetahui `functionId` nilai-nilai fungsi Anda. Urutan daftar penting.

  1. Yang`runtime`, yang `APPSYNC_JS` (JavaScript). `runtimeVersion`Saat ini adalah`1.0.0`.

  1. Itu`code`, yang berisi langkah sebelum dan sesudah.
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Sends a request to `put` an item in the DynamoDB data source
      */
     export function request(ctx) {
       const { id, ...values } = ctx.args;
       return {
         operation: 'PutItem',
         key: util.dynamodb.toMapValues({ id }),
         attributeValues: util.dynamodb.toMapValues(values),
       };
     }
     
     /**
      * returns the result of the `put` operation
      */
     export function response(ctx) {
       return ctx.result;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-resolver \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --type-name Mutation \
  --field-name createPost \
  --kind PIPELINE \
  --pipeline-config functions=vulcmbfcxffiram63psb4dduoa \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file:///path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "resolver": {
          "typeName": "Mutation",
          "fieldName": "createPost",
          "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/createPost",
          "kind": "PIPELINE",
          "pipelineConfig": {
              "functions": [
                  "vulcmbfcxffiram63psb4dduoa"
              ]
          },
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output goes here"
      }
  }
  ```

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.
+ Untuk membuat mutasi, dengan asumsi Anda berada di proyek yang sama, Anda dapat menambahkannya ke file tumpukan seperti kueri. Berikut adalah fungsi dan resolver yang dimodifikasi untuk mutasi yang menambahkan yang baru `Post` ke tabel:

  ```
  const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', {
    name: 'add_posts_func_1',
    add_api,
    dataSource: add_api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table),
        code: appsync.Code.fromInline(`
            export function request(ctx) {
              return {
                operation: 'PutItem',
                key: util.dynamodb.toMapValues({id: util.autoId()}),
                attributeValues: util.dynamodb.toMapValues(ctx.args.input),
              };
            }
  
            export function response(ctx) {
              return ctx.result;
            }
        `), 
    runtime: appsync.FunctionRuntime.JS_1_0_0,
  });
  
  new appsync.Resolver(this, 'pipeline-resolver-create-posts', {
    add_api,
    typeName: 'Mutation',
    fieldName: 'createPost',
        code: appsync.Code.fromInline(`
            export function request(ctx) {
              return {};
            }
  
            export function response(ctx) {
              return ctx.prev.result;
            }
        `),
    runtime: appsync.FunctionRuntime.JS_1_0_0,
    pipelineConfig: [add_func_2],
  });
  ```
**catatan**  
Karena mutasi dan kueri ini terstruktur dengan cara yang sama, kami hanya akan menjelaskan perubahan yang kami buat untuk membuat mutasi.   
Dalam fungsinya, kami mengubah id CFN menjadi `func-add-post` dan nama `add_posts_func_1` untuk mencerminkan fakta bahwa kami menambahkan `Posts` ke tabel. Di sumber data, kami membuat asosiasi baru ke table (`add_ddb_table`) kami di AWS AppSync konsol `table-for-posts-2` karena `addDynamoDbDataSource` metode memerlukannya. Perlu diingat, asosiasi baru ini masih menggunakan tabel yang sama yang kita buat sebelumnya, tetapi kita sekarang memiliki dua koneksi ke sana di AWS AppSync konsol: satu untuk kueri sebagai `table-for-posts` dan satu untuk mutasi sebagai`table-for-posts-2`. Kode diubah untuk menambahkan a `Post` dengan menghasilkan `id` nilainya secara otomatis dan menerima masukan klien untuk bidang lainnya.  
Dalam resolver, kita mengubah nilai id `pipeline-resolver-create-posts` untuk mencerminkan fakta bahwa kita menambahkan `Posts` ke tabel. Untuk mencerminkan mutasi dalam skema, nama tipe diubah menjadi`Mutation`, dan nama,. `createPost` Konfigurasi pipeline disetel ke fungsi mutasi baru kami. `add_func_2`

------

Untuk meringkas apa yang terjadi dalam contoh ini, AWS AppSync secara otomatis mengonversi argumen yang ditentukan di `createPost` bidang dari skema GraphQL Anda menjadi operasi DynamoDB. Contoh menyimpan catatan di DynamoDB menggunakan kunci`id`, yang secara otomatis dibuat menggunakan helper kami. `util.autoId()` Semua bidang lain yang Anda berikan ke argumen konteks (`ctx.args.input`) dari permintaan yang dibuat di AWS AppSync konsol atau sebaliknya akan disimpan sebagai atribut tabel. Baik kunci dan atribut secara otomatis dipetakan ke format DynamoDB yang kompatibel menggunakan helper. `util.dynamodb.toMapValues(values)`

AWS AppSync juga mendukung alur kerja pengujian dan debug untuk mengedit resolver. Anda dapat menggunakan `context` objek tiruan untuk melihat nilai template yang diubah sebelum memanggilnya. Secara opsional, Anda dapat melihat permintaan lengkap ke sumber data secara interaktif saat menjalankan kueri. Untuk informasi selengkapnya, lihat [Menguji dan debug resolvers (JavaScript)](https://docs.aws.amazon.com/appsync/latest/devguide/test-debug-resolvers-js.html) serta [Monitoring](https://docs.aws.amazon.com/appsync/latest/devguide/monitoring.html#aws-appsync-monitoring) dan logging.

## Resolver tingkat lanjut
<a name="advanced-resolvers-js"></a>

Jika Anda mengikuti bagian pagination opsional dalam [Merancang skema Anda](designing-your-schema.md#aws-appsync-designing-your-schema), Anda masih perlu menambahkan resolver Anda ke permintaan Anda untuk menggunakan pagination. Contoh kami menggunakan pagination query yang dipanggil `getPosts` untuk mengembalikan hanya sebagian dari hal-hal yang diminta pada suatu waktu. Kode resolver kami di bidang itu mungkin terlihat seperti ini:

```
/**
 * Performs a scan on the dynamodb data source
 */
export function request(ctx) {
  const { limit = 20, nextToken } = ctx.args;
  return { operation: 'Scan', limit, nextToken };
}

/**
 * @returns the result of the `put` operation
 */
export function response(ctx) {
  const { items: posts = [], nextToken } = ctx.result;
  return { posts, nextToken };
}
```

Dalam permintaan, kami lulus dalam konteks permintaan. Kami `limit` adalah*20*, artinya kami mengembalikan hingga 20 `Posts` di kueri pertama. `nextToken`Kursor kami diperbaiki ke `Post` entri pertama di sumber data. Ini diteruskan ke argumen. Permintaan kemudian melakukan pemindaian dari yang pertama `Post` hingga nomor batas pemindaian. Sumber data menyimpan hasil dalam konteks, yang diteruskan ke respons. Respons mengembalikan `Posts` itu diambil, kemudian menetapkan `nextToken` diatur ke `Post` entri tepat setelah batas. Permintaan berikutnya dikirim untuk melakukan hal yang sama persis tetapi dimulai dari offset tepat setelah kueri pertama. Perlu diingat bahwa permintaan semacam ini dilakukan secara berurutan dan tidak secara paralel.

# Menguji dan men-debug resolver di () AWS AppSync JavaScript
<a name="test-debug-resolvers-js"></a>

AWS AppSync mengeksekusi resolver pada bidang GraphQL terhadap sumber data. Saat bekerja dengan resolver pipeline, fungsi berinteraksi dengan sumber data Anda. Seperti yang dijelaskan dalam [ikhtisar JavaScript resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html), fungsi berkomunikasi dengan sumber data dengan menggunakan penangan permintaan dan respons yang ditulis JavaScript dan dijalankan pada runtime. `APPSYNC_JS` Ini memungkinkan Anda untuk memberikan logika dan kondisi khusus sebelum dan sesudah berkomunikasi dengan sumber data.

Untuk membantu pengembang menulis, menguji, dan men-debug resolver ini, AWS AppSync konsol juga menyediakan alat untuk membuat permintaan dan respons GraphQL dengan data tiruan ke penyelesai bidang individual. Selain itu, Anda dapat melakukan kueri, mutasi, dan langganan di AWS AppSync konsol dan melihat aliran log terperinci dari seluruh permintaan dari Amazon. CloudWatch Ini termasuk hasil dari sumber data.

## Pengujian dengan data tiruan
<a name="testing-with-mock-data-js"></a>

Ketika resolver GraphQL dipanggil, itu berisi objek yang memiliki informasi `context` yang relevan tentang permintaan. Ini termasuk argumen dari klien, informasi identitas, dan data dari bidang GraphQL induk. Ini juga menyimpan hasil dari sumber data, yang dapat digunakan dalam penangan respons. Untuk informasi selengkapnya tentang struktur ini dan utilitas pembantu yang tersedia untuk digunakan saat pemrograman, lihat referensi [objek konteks Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html).

Saat menulis atau mengedit fungsi resolver, Anda dapat meneruskan objek *konteks *tiruan* atau pengujian* ke editor konsol. Ini memungkinkan Anda untuk melihat bagaimana permintaan dan penangan respons mengevaluasi tanpa benar-benar berjalan terhadap sumber data. Misalnya, Anda dapat lulus `firstname: Shaggy` argumen pengujian dan melihat bagaimana itu mengevaluasi saat menggunakan `ctx.args.firstname` dalam kode template Anda. Anda juga dapat menguji evaluasi setiap pembantu utilitas seperti `util.autoId()` atau`util.time.nowISO8601()`.

### Menguji penyelesai
<a name="test-a-resolver-js"></a>

Contoh ini akan menggunakan AWS AppSync konsol untuk menguji resolver.

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Functions**.

1. Pilih fungsi yang ada.

1. Di bagian atas halaman **fungsi Perbarui**, **pilih Pilih konteks pengujian**, lalu pilih **Buat konteks baru**.

1. Pilih objek konteks sampel atau isi JSON secara manual di jendela **Konfigurasi konteks pengujian** di bawah ini.

1. Masukkan **nama konteks Teks**.

1. Pilih tombol **Simpan**.

1. **Untuk mengevaluasi resolver Anda menggunakan objek konteks tiruan ini, pilih Run Test.**

Untuk contoh yang lebih praktis, misalkan Anda memiliki aplikasi yang menyimpan tipe `Dog` GraphQL yang menggunakan pembuatan ID otomatis untuk objek dan menyimpannya di Amazon DynamoDB. Anda juga ingin menulis beberapa nilai dari argumen mutasi GraphQL dan hanya mengizinkan pengguna tertentu untuk melihat respons. Cuplikan berikut menunjukkan seperti apa skema itu:

```
type Dog {
  breed: String
  color: String
}

type Mutation {
  addDog(firstname: String, age: Int): Dog
}
```

Anda dapat menulis AWS AppSync fungsi dan menambahkannya ke `addDog` resolver Anda untuk menangani mutasi. Untuk menguji AWS AppSync fungsi Anda, Anda dapat mengisi objek konteks seperti contoh berikut. Berikut ini memiliki argumen dari klien `name` dan`age`, dan `username` diisi dalam `identity` objek:

```
{
    "arguments" : {
        "firstname": "Shaggy",
        "age": 4
    },
    "source" : {},
    "result" : {
        "breed" : "Miniature Schnauzer",
        "color" : "black_grey"
    },
    "identity": {
        "sub" : "uuid",
        "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}",
        "username" : "Nadia",
        "claims" : { },
        "sourceIp" :[  "x.x.x.x" ],
        "defaultAuthStrategy" : "ALLOW"
    }
}
```

Anda dapat menguji AWS AppSync fungsi Anda menggunakan kode berikut:

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

export function request(ctx) {
  return {
    operation: 'PutItem',
    key: util.dynamodb.toMapValues({ id: util.autoId() }),
    attributeValues: util.dynamodb.toMapValues(ctx.args),
  };
}

export function response(ctx) {
  if (ctx.identity.username === 'Nadia') {
    console.log("This request is allowed")
    return ctx.result;
  }
  util.unauthorized();
}
```

Handler permintaan dan respons yang dievaluasi memiliki data dari objek konteks pengujian Anda dan nilai yang dihasilkan dari. `util.autoId()` Selain itu, jika Anda mengubah `username` ke nilai selain`Nadia`, hasilnya tidak akan dikembalikan karena pemeriksaan otorisasi akan gagal. Untuk informasi selengkapnya tentang kontrol akses berbutir halus, lihat Kasus penggunaan [otorisasi](security-authorization-use-cases.md#aws-appsync-security-authorization-use-cases).

### Menguji permintaan dan penangan respons dengan's AWS AppSync APIs
<a name="testing-with-appsync-api-js"></a>

Anda dapat menggunakan perintah `EvaluateCode` API untuk menguji kode Anda dari jarak jauh dengan data tiruan. Untuk memulai dengan perintah, pastikan Anda telah menambahkan `appsync:evaluateMappingCode` izin ke kebijakan Anda. Contoh:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "appsync:evaluateCode",
            "Resource": "arn:aws:appsync:us-east-1:111122223333:*"
        }
    ]
}
```

------

Anda dapat memanfaatkan perintah dengan menggunakan [AWS CLI](https://aws.amazon.com/cli/)atau [AWS SDKs](https://aws.amazon.com/tools/). Misalnya, ambil `Dog` skema dan permintaan AWS AppSync fungsinya dan penangan respons dari bagian sebelumnya. Menggunakan CLI di stasiun lokal Anda, simpan kode ke file bernama`code.js`, lalu simpan `context` objek ke file bernama. `context.json` Dari shell Anda, jalankan perintah berikut:

```
$ aws appsync evaluate-code \
  --code file://code.js \
  --function response \
  --context file://context.json \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0
```

Responsnya `evaluationResult` berisi muatan yang dikembalikan oleh handler Anda. Ini juga berisi `logs` objek, yang memegang daftar log yang dihasilkan oleh handler Anda selama evaluasi. Hal ini memudahkan untuk men-debug eksekusi kode Anda dan melihat informasi tentang evaluasi Anda untuk membantu memecahkan masalah. Contoh:

```
{
    "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}",
    "logs": [
        "INFO - code.js:13:5: \"This request is allowed\""
    ]
}
```

`evaluationResult`Dapat diurai sebagai JSON, yang memberikan: 

```
{
  "breed": "Miniature Schnauzer",
  "color": "black_grey"
}
```

Dengan menggunakan SDK, Anda dapat dengan mudah menggabungkan pengujian dari rangkaian pengujian favorit untuk memvalidasi perilaku penangan Anda. Sebaiknya buat pengujian menggunakan [Jest Testing Framework](https://jestjs.io/), tetapi rangkaian pengujian apa pun berfungsi. Cuplikan berikut menunjukkan validasi hipotetis berjalan. Perhatikan bahwa kami mengharapkan respons evaluasi menjadi JSON yang valid, jadi kami gunakan `JSON.parse` untuk mengambil JSON dari respons string:

```
const AWS = require('aws-sdk')
const fs = require('fs')
const client = new AWS.AppSync({ region: 'us-east-2' })
const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0')

test('request correctly calls DynamoDB', async () => {
  const code = fs.readFileSync('./code.js', 'utf8')
  const context = fs.readFileSync('./context.json', 'utf8')
  const contextJSON = JSON.parse(context)
  
  const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).promise()
  const result = JSON.parse(response.evaluationResult)
  
  expect(result.key.id.S).toBeDefined()
  expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname)
})
```

 Ini menghasilkan hasil sebagai berikut:

```
Ran all test suites.
> jest

PASS ./index.test.js
✓ request correctly calls DynamoDB (543 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 totalTime: 1.511 s, estimated 2 s
```

## Mendebug kueri langsung
<a name="debugging-a-live-query-js"></a>

Tidak ada pengganti untuk end-to-end pengujian dan logging untuk men-debug aplikasi produksi. AWS AppSync memungkinkan Anda mencatat kesalahan dan detail permintaan lengkap menggunakan Amazon CloudWatch. Selain itu, Anda dapat menggunakan AWS AppSync konsol untuk menguji kueri GraphQL, mutasi, dan langganan serta data log streaming langsung untuk setiap permintaan kembali ke editor kueri untuk di-debug secara real time. Untuk langganan, log menampilkan informasi waktu koneksi.

Untuk melakukan ini, Anda harus mengaktifkan CloudWatch log Amazon terlebih dahulu, seperti yang dijelaskan dalam [Pemantauan dan pencatatan](monitoring.md#aws-appsync-monitoring). Selanjutnya, di AWS AppSync konsol, pilih tab **Queries dan kemudian masukkan kueri** GraphQL yang valid. Di bagian kanan bawah, klik dan seret jendela **Log** untuk membuka tampilan log. Di bagian atas halaman, pilih ikon panah putar untuk menjalankan kueri GraphQL Anda. Dalam beberapa saat, log permintaan dan respons lengkap Anda untuk operasi dialirkan ke bagian ini dan Anda dapat melihatnya di konsol.

# Mengkonfigurasi dan menggunakan resolver pipeline di () AWS AppSync JavaScript
<a name="pipeline-resolvers-js"></a>

AWS AppSync mengeksekusi resolver pada bidang GraphQL. Dalam beberapa kasus, aplikasi memerlukan eksekusi beberapa operasi untuk menyelesaikan satu bidang GraphQL. Dengan resolver pipeline, pengembang sekarang dapat membuat operasi yang disebut Fungsi dan menjalankannya secara berurutan. Pipeline resolver berguna untuk aplikasi yang, misalnya, memerlukan melakukan pemeriksaan otorisasi sebelum mengambil data untuk bidang.

Untuk informasi selengkapnya tentang arsitektur resolver JavaScript pipeline, lihat ikhtisar [JavaScriptresolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html#anatomy-of-a-pipeline-resolver-js).

## Langkah 1: Membuat resolver pipa
<a name="create-a-pipeline-resolver-js"></a>

Di AWS AppSync konsol, buka halaman **Skema**.

Simpan skema berikut:

```
schema {
    query: Query
    mutation: Mutation
}

type Mutation {
    signUp(input: Signup): User
}

type Query {
    getUser(id: ID!): User
}

input Signup {
    username: String!
    email: String!
}

type User {
    id: ID!
    username: String
    email: AWSEmail
}
```

**Kita akan memasang resolver pipa ke bidang **SignUp** pada tipe Mutasi.** Pada tipe **Mutasi** di sisi kanan, pilih **Lampirkan** di sebelah bidang `signUp` mutasi. Atur resolver ke `pipeline resolver` dan `APPSYNC_JS` runtime, lalu buat resolver.

Pipeline resolver kami mendaftarkan pengguna dengan terlebih dahulu memvalidasi input alamat email dan kemudian menyimpan pengguna dalam sistem. **Kami akan merangkum validasi email di dalam fungsi **ValidateEmail dan penyimpanan pengguna di dalam fungsi SaveUser**.** **Fungsi **ValidateEmail** dijalankan terlebih dahulu, dan jika email valid, maka fungsi SaveUser dijalankan.**

Alur eksekusi adalah sebagai berikut:

1. Mutation.signup penangan permintaan resolver

1. fungsi ValidateEmail

1. Fungsi SaveUser

1. Penangan respons penyelesai mutasi.signup

Karena kami mungkin akan menggunakan kembali fungsi **ValidateEmail** di resolver lain di API kami, kami ingin menghindari mengakses `ctx.args` karena ini akan berubah dari satu bidang GraphQL ke bidang GraphQL lainnya. Sebagai gantinya, kita dapat menggunakan `ctx.stash` untuk menyimpan atribut email dari argumen field `signUp(input: Signup)` input.

Perbarui kode resolver Anda dengan mengganti fungsi permintaan dan respons Anda:

```
export function request(ctx) {
    ctx.stash.email = ctx.args.input.email
    return {};
}

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

Pilih **Buat** atau **Simpan** untuk memperbarui resolver.

## Langkah 2: Membuat fungsi
<a name="create-a-function-js"></a>

Dari halaman resolver pipeline, di bagian **Functions**, klik **Add function**, lalu **Create new** function. Dimungkinkan juga untuk membuat fungsi tanpa melalui halaman resolver; untuk melakukan ini, di AWS AppSync konsol, buka halaman **Fungsi**. Pilih tombol **Create Function**. Mari buat fungsi yang memeriksa apakah email valid dan berasal dari domain tertentu. Jika email tidak valid, fungsi tersebut menimbulkan kesalahan. Jika tidak, itu meneruskan input apa pun yang diberikan.

Pastikan Anda telah membuat sumber data dari tipe **NONE**. Pilih sumber data ini di daftar **Nama sumber data**. Untuk **nama fungsi**, masukkan`validateEmail`. Di area **kode fungsi**, timpa semuanya dengan cuplikan ini:

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

export function request(ctx) {
  const { email } = ctx.stash;
  const valid = util.matches(
    '^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com',
    email
  );
  if (!valid) {
    util.error(`"${email}" is not a valid email.`);
  }

  return { payload: { email } };
}

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

Tinjau input Anda, lalu pilih **Buat**. Kami baru saja membuat fungsi **ValidateEmail** kami. ****Ulangi langkah-langkah ini untuk membuat fungsi SaveUser dengan kode berikut (Demi kesederhanaan, kami menggunakan sumber data NONE dan berpura-pura pengguna telah disimpan dalam sistem setelah fungsi dijalankan.**** ):

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

export function request(ctx) {
  return ctx.prev.result;
}

export function response(ctx) {
  ctx.result.id = util.autoId();
  return ctx.result;
}
```

Kami baru saja membuat fungsi **SaveUser** kami.

## Langkah 3: Menambahkan fungsi ke resolver pipa
<a name="adding-a-function-to-a-pipeline-resolver-js"></a>

Fungsi kita seharusnya ditambahkan secara otomatis ke resolver pipeline yang baru saja kita buat. Jika ini tidak terjadi, atau Anda membuat fungsi melalui halaman **Fungsi**, Anda dapat mengklik **Tambah fungsi** kembali pada halaman `signUp` resolver untuk melampirkannya. Tambahkan fungsi **ValidateEmail** **dan SaveUser ke resolver**. **Fungsi **ValidateEmail** harus ditempatkan sebelum fungsi SaveUser.** Saat Anda menambahkan lebih banyak fungsi, Anda dapat menggunakan opsi **pindah ke atas** dan **bergerak ke bawah** untuk mengatur ulang urutan eksekusi fungsi Anda. Tinjau perubahan Anda, lalu pilih **Simpan**.

## Langkah 4: Menjalankan kueri
<a name="running-a-query-js"></a>

Di AWS AppSync konsol, buka halaman **Kueri.** Di penjelajah, pastikan Anda menggunakan mutasi Anda. Jika tidak, pilih `Mutation` di daftar drop-down, lalu pilih`+`. Masukkan kueri berikut:

```
mutation {
  signUp(input: {email: "nadia@myvaliddomain.com", username: "nadia"}) {
    id
    username
  }
}
```

Ini harus mengembalikan sesuatu seperti:

```
{
  "data": {
    "signUp": {
      "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc",
      "username": "nadia"
    }
  }
}
```

Kami telah berhasil mendaftarkan pengguna kami dan memvalidasi email input menggunakan resolver pipeline.

# Membuat kueri dasar (VTL)
<a name="configuring-resolvers"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

GraphQL resolver menghubungkan bidang dalam skema tipe ke sumber data. Resolver adalah mekanisme dimana permintaan dipenuhi. AWS AppSync dapat secara otomatis membuat dan menghubungkan resolver dari skema atau membuat skema dan menghubungkan resolver dari tabel yang ada tanpa Anda perlu menulis kode apa pun.

Resolver AWS AppSync digunakan JavaScript untuk mengonversi ekspresi GraphQL menjadi format yang dapat digunakan sumber data. Atau, template pemetaan dapat ditulis dalam [Apache Velocity Template Language (VTL) untuk](https://velocity.apache.org/engine/2.0/vtl-reference.html) mengubah ekspresi GraphQL menjadi format yang dapat digunakan sumber data.

Bagian ini akan menunjukkan cara mengkonfigurasi resolver menggunakan VTL. [Panduan pemrograman gaya tutorial pengantar untuk menulis resolver dapat ditemukan di panduan pemrograman [template pemetaan Resolver, dan utilitas pembantu yang tersedia untuk digunakan ketika pemrograman](resolver-mapping-template-reference-programming-guide.md#aws-appsync-resolver-mapping-template-reference-programming-guide) dapat ditemukan di referensi konteks template pemetaan Resolver.](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference) AWS AppSync juga memiliki alur pengujian dan debug bawaan yang dapat Anda gunakan saat mengedit atau menulis dari awal. Untuk informasi selengkapnya, lihat [Menguji dan men-debug resolver](test-debug-resolvers.md#aws-appsync-test-debug-resolvers).

Sebaiknya ikuti panduan ini sebelum mencoba menggunakan salah satu tutorial yang disebutkan di atas.

Di bagian ini, kita akan membahas cara membuat resolver, menambahkan resolver untuk mutasi, dan menggunakan konfigurasi lanjutan.

## Buat resolver pertama Anda
<a name="create-your-first-resolver"></a>

Mengikuti contoh dari bagian sebelumnya, langkah pertama adalah membuat resolver untuk tipe Anda`Query`.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di sisi kanan halaman, ada jendela yang disebut **Resolvers**. Kotak ini berisi daftar jenis dan bidang seperti yang didefinisikan dalam jendela **Skema** Anda di sisi kiri halaman. Anda dapat melampirkan resolver ke bidang. Misalnya, di bawah Jenis **kueri**, pilih **Lampirkan** di sebelah `getTodos` bidang.

1. Pada halaman **Create Resolver**, pilih sumber data yang Anda buat dalam panduan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html). Di jendela **Konfigurasikan templat pemetaan**, Anda dapat memilih templat pemetaan permintaan umum dan respons menggunakan daftar drop-down di sebelah kanan atau menulis sendiri.
**catatan**  
Pasangan template pemetaan permintaan ke template pemetaan respons disebut resolver unit. Resolver unit biasanya dimaksudkan untuk melakukan operasi hafalan; kami sarankan menggunakannya hanya untuk operasi tunggal dengan sejumlah kecil sumber data. Untuk operasi yang lebih kompleks, sebaiknya gunakan resolver pipa, yang dapat menjalankan beberapa operasi dengan beberapa sumber data secara berurutan.  
Untuk informasi selengkapnya tentang perbedaan antara templat pemetaan permintaan dan respons, lihat Resolver [unit](https://docs.aws.amazon.com//appsync/latest/devguide/resolver-mapping-template-reference-overview.html#unit-resolvers).  
Untuk informasi selengkapnya tentang penggunaan resolver pipeline, lihat [Pipeline](pipeline-resolvers.md#aws-appsync-pipeline-resolvers) resolvers.

1. Untuk kasus penggunaan umum, AWS AppSync konsol memiliki templat bawaan yang dapat Anda gunakan untuk mendapatkan item dari sumber data (misalnya, semua kueri item, pencarian individual, dll.). Misalnya, pada versi sederhana skema dari [Merancang skema Anda](designing-your-schema.md#aws-appsync-designing-your-schema) di mana `getTodos` tidak memiliki pagination, template pemetaan permintaan untuk item daftar adalah sebagai berikut:

   ```
   {
       "version" : "2017-02-28",
       "operation" : "Scan"
   }
   ```

1. Anda selalu membutuhkan template pemetaan respons untuk menyertai permintaan. Konsol menyediakan default dengan nilai passthrough berikut untuk daftar:

   ```
   $util.toJson($ctx.result.items)
   ```

   Dalam contoh ini, `context` objek (alias sebagai`$ctx`) untuk daftar item memiliki formulir`$context.result.items`. Jika operasi GraphQL Anda mengembalikan satu item, itu akan menjadi. `$context.result` AWS AppSync menyediakan fungsi pembantu untuk operasi umum, seperti `$util.toJson` fungsi yang tercantum sebelumnya, untuk memformat respons dengan benar. Untuk daftar lengkap fungsi, lihat Referensi utilitas [template pemetaan Resolver](resolver-util-reference.md#aws-appsync-resolver-mapping-template-util-reference).

1. Pilih **Simpan Resolver**.

------
#### [ API ]

1. Buat objek resolver dengan memanggil API. [https://docs.aws.amazon.com/appsync/latest/APIReference/API_CreateResolver.html](https://docs.aws.amazon.com/appsync/latest/APIReference/API_CreateResolver.html)

1. Anda dapat memodifikasi bidang resolver dengan memanggil API. [https://docs.aws.amazon.com/appsync/latest/APIReference/API_UpdateResolver.html](https://docs.aws.amazon.com/appsync/latest/APIReference/API_UpdateResolver.html)

------
#### [ CLI ]

1. Buat resolver dengan menjalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)

   Anda harus mengetikkan 6 parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. `type-name`Jenis yang ingin Anda modifikasi dalam skema Anda. Dalam contoh konsol, ini adalah`Query`.

   1. `field-name`Bidang yang ingin Anda modifikasi dalam tipe Anda. Dalam contoh konsol, ini adalah`getTodos`.

   1. Sumber data yang Anda buat dalam panduan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html). `data-source-name`

   1. Itu`request-mapping-template`, yang merupakan badan permintaan. Dalam contoh konsol, ini adalah:

      ```
      {
          "version" : "2017-02-28",
          "operation" : "Scan"
      }
      ```

   1. Itu`response-mapping-template`, yang merupakan tubuh respons. Dalam contoh konsol, ini adalah:

      ```
      $util.toJson($ctx.result.items)
      ```

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-resolver --api-id abcdefghijklmnopqrstuvwxyz --type-name Query --field-name getTodos --data-source-name TodoTable --request-mapping-template "{ "version" : "2017-02-28", "operation" : "Scan", }" --response-mapping-template ""$"util.toJson("$"ctx.result.items)"
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "resolver": {
           "kind": "UNIT",
           "dataSourceName": "TodoTable",
           "requestMappingTemplate": "{ version : 2017-02-28, operation : Scan, }",
           "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Query/resolvers/getTodos",
           "typeName": "Query",
           "fieldName": "getTodos",
           "responseMappingTemplate": "$util.toJson($ctx.result.items)"
       }
   }
   ```

1. Untuk memodifikasi templat and/or pemetaan bidang resolver, jalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-resolver.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-resolver.html)

   Dengan pengecualian `api-id` parameter, parameter yang digunakan dalam `create-resolver` perintah akan ditimpa oleh nilai-nilai baru dari `update-resolver` perintah.

------

## Menambahkan resolver untuk mutasi
<a name="adding-a-resolver-for-mutations"></a>

Langkah selanjutnya adalah membuat resolver untuk tipe Anda`Mutation`.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di bawah jenis **Mutasi**, pilih **Lampirkan** di sebelah `addTodo` bidang.

1. Pada halaman **Create Resolver**, pilih sumber data yang Anda buat dalam panduan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html).

1. Di jendela **Configure mapping templates**, Anda harus memodifikasi template permintaan karena ini adalah mutasi di mana Anda menambahkan item baru ke DynamoDB. Gunakan template pemetaan permintaan berikut:

   ```
   {
       "version" : "2017-02-28",
       "operation" : "PutItem",
       "key" : {
           "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
       },
       "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
   }
   ```

1. AWS AppSync secara otomatis mengonversi argumen yang ditentukan di `addTodo` bidang dari skema GraphQL Anda menjadi operasi DynamoDB. Contoh sebelumnya menyimpan catatan di DynamoDB menggunakan kunci `id` dari, yang dilewatkan dari argumen mutasi sebagai. `$ctx.args.id` Semua bidang lain yang Anda lewati secara otomatis dipetakan ke atribut DynamoDB. `$util.dynamodb.toMapValuesJson($ctx.args)`

   Untuk resolver ini, gunakan template pemetaan respons berikut:

   ```
   $util.toJson($ctx.result)
   ```

   AWS AppSync juga mendukung alur kerja pengujian dan debug untuk mengedit resolver. Anda dapat menggunakan `context` objek tiruan untuk melihat nilai template yang diubah sebelum memanggil. Secara opsional, Anda dapat melihat eksekusi permintaan penuh ke sumber data secara interaktif saat menjalankan kueri. Untuk informasi selengkapnya, lihat [Menguji dan men-debug resolver](test-debug-resolvers.md#aws-appsync-test-debug-resolvers) serta [Monitoring](monitoring.md#aws-appsync-monitoring) dan logging.

1. Pilih **Simpan Resolver**.

------
#### [ API ]

Anda juga dapat melakukan ini APIs dengan menggunakan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------
#### [ CLI ]

Anda juga dapat melakukan ini di CLI dengan memanfaatkan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------

[Pada titik ini, jika Anda tidak menggunakan resolver lanjutan, Anda dapat mulai menggunakan GraphQL API seperti yang diuraikan dalam Menggunakan API Anda.](using-your-api.md#aws-appsync-using-your-api)

## Resolver tingkat lanjut
<a name="advanced-resolvers"></a>

Jika Anda mengikuti bagian Advanced dan Anda sedang membuat skema sampel dalam [Merancang skema Anda](designing-your-schema.md#aws-appsync-designing-your-schema) untuk melakukan pemindaian paginasi, gunakan template permintaan berikut untuk bidang sebagai gantinya: `getTodos`

```
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "limit": $util.defaultIfNull(${ctx.args.limit}, 20),
    "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null))
}
```

Untuk kasus penggunaan pagination ini, pemetaan respons lebih dari sekadar passthrough karena harus berisi *kursor* (sehingga klien tahu halaman apa yang akan dimulai selanjutnya) dan set hasil. Template pemetaan adalah sebagai berikut:

```
{
    "todos": $util.toJson($context.result.items),
    "nextToken": $util.toJson($context.result.nextToken)
}
```

Bidang dalam template pemetaan respons sebelumnya harus sesuai dengan bidang yang ditentukan dalam tipe Anda. `TodoConnection`

Untuk kasus relasi di mana Anda memiliki `Comments` tabel dan Anda menyelesaikan kolom komentar pada `Todo` tipe (yang mengembalikan tipe`[Comment]`), Anda dapat menggunakan template pemetaan yang menjalankan kueri terhadap tabel kedua. Untuk melakukan ini, Anda harus sudah membuat sumber data untuk `Comments` tabel seperti yang diuraikan dalam [Melampirkan sumber data](attaching-a-data-source.md#aws-appsync-getting-started-build-a-schema-from-scratch).

**catatan**  
Kami menggunakan operasi kueri terhadap tabel kedua hanya untuk tujuan ilustrasi. Anda dapat menggunakan operasi lain terhadap DynamoDB sebagai gantinya. Selain itu, Anda dapat menarik data dari sumber data lain, seperti AWS Lambda atau Amazon OpenSearch Service, karena relasinya dikendalikan oleh skema GraphQL Anda.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di bawah tipe **Todo**, pilih **Lampirkan** di sebelah `comments` bidang.

1. Pada halaman **Create Resolver**, pilih sumber data tabel **Komentar** Anda. Nama default untuk tabel **Komentar** dari panduan mulai cepat adalah`AppSyncCommentTable`, tetapi dapat bervariasi tergantung pada nama yang Anda berikan.

1. Tambahkan cuplikan berikut ke template pemetaan permintaan Anda:

   ```
   {
       "version": "2017-02-28",
       "operation": "Query",
       "index": "todoid-index",
       "query": {
           "expression": "todoid = :todoid",
           "expressionValues": {
               ":todoid": {
                   "S": $util.toJson($context.source.id)
               }
           }
       }
   }
   ```

1. `context.source`Referensi objek induk dari bidang saat ini yang sedang diselesaikan. Dalam contoh ini, `source.id` mengacu pada `Todo` objek individu, yang kemudian digunakan untuk ekspresi query.

   Anda dapat menggunakan template pemetaan respons passthrough sebagai berikut:

   ```
   $util.toJson($ctx.result.items)
   ```

1. Pilih **Simpan Resolver**.

1. Terakhir, kembali ke halaman **Skema** di konsol, lampirkan resolver ke `addComment` bidang, dan tentukan sumber data untuk tabel. `Comments` Templat pemetaan permintaan dalam hal ini sederhana `PutItem` dengan spesifik `todoid` yang dikomentari sebagai argumen, tetapi Anda menggunakan `$utils.autoId()` utilitas untuk membuat kunci pengurutan unik untuk komentar sebagai berikut:

   ```
   {
       "version": "2017-02-28",
       "operation": "PutItem",
       "key": {
           "todoid": { "S": $util.toJson($context.arguments.todoid) },
           "commentid": { "S": "$util.autoId()" }
       },
       "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
   }
   ```

   Gunakan template respon passthrough sebagai berikut:

   ```
   $util.toJson($ctx.result)
   ```

------
#### [ API ]

Anda juga dapat melakukan ini APIs dengan menggunakan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------
#### [ CLI ]

Anda juga dapat melakukan ini di CLI dengan memanfaatkan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------

# Menonaktifkan template pemetaan VTL dengan penyelesai Lambda langsung (VTL)
<a name="direct-lambda-reference"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

Dengan penyelesai Lambda langsung, Anda dapat menghindari penggunaan templat pemetaan VTL saat menggunakan sumber data. AWS Lambda AWS AppSync dapat memberikan payload default ke fungsi Lambda Anda serta terjemahan default dari respons fungsi Lambda ke tipe GraphQL. Anda dapat memilih untuk memberikan template permintaan, template respons, atau tidak keduanya dan AWS AppSync akan menanganinya sesuai dengan itu. 

Untuk mempelajari selengkapnya tentang payload permintaan default dan terjemahan respons yang AWS AppSync disediakan, lihat referensi penyelesai [Lambda Langsung](resolver-mapping-template-reference-lambda.md#direct-lambda-resolvers). Untuk informasi selengkapnya tentang menyiapkan sumber AWS Lambda data dan menyiapkan Kebijakan Kepercayaan IAM, lihat [Melampirkan sumber data](attaching-a-data-source.md). 

## Konfigurasikan penyelesai Lambda langsung
<a name="direct-lambda-reference-resolvers"></a>

Bagian berikut akan menunjukkan cara melampirkan sumber data Lambda dan menambahkan resolver Lambda ke bidang Anda.

### Tambahkan sumber data Lambda
<a name="direct-lambda-datasource"></a>

Sebelum Anda dapat mengaktifkan resolver Lambda langsung, Anda harus menambahkan sumber data Lambda.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Sumber data**.

1. Pilih **Buat sumber data**.

   1. Untuk **nama sumber data**, masukkan nama untuk sumber data Anda, seperti**myFunction**. 

   1. Untuk **tipe sumber data**, pilih **AWS Lambda fungsi**.

   1. Untuk **Wilayah**, pilih wilayah yang sesuai.

   1. Untuk **Fungsi ARN**, pilih fungsi Lambda dari daftar dropdown. Anda dapat mencari nama fungsi atau secara manual memasukkan ARN dari fungsi yang ingin Anda gunakan. 

   1. Buat peran IAM baru (disarankan) atau pilih peran yang sudah ada yang memiliki izin `lambda:invokeFunction` IAM. Peran yang ada memerlukan kebijakan kepercayaan, seperti yang dijelaskan di bagian [Melampirkan sumber data](attaching-a-data-source.md). 

      Berikut ini adalah contoh kebijakan IAM yang memiliki izin yang diperlukan untuk melakukan operasi pada sumber daya:

------
#### [ JSON ]

****  

      ```
      { 
           "Version":"2012-10-17",		 	 	  
           "Statement": [ 
               { 
                   "Effect": "Allow", 
                   "Action": [ "lambda:invokeFunction" ], 
                   "Resource": [ 
                       "arn:aws:lambda:us-west-2:123456789012:function:myFunction", 
                       "arn:aws:lambda:us-west-2:123456789012:function:myFunction:*" 
                   ] 
               } 
           ] 
       }
      ```

------

1. Pilih tombol **Buat**.

------
#### [ CLI ]

1. Buat objek sumber data dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-data-source.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-data-source.html)perintah.

   Anda harus mengetikkan 4 parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. `name`Dari sumber data Anda. Dalam contoh konsol, ini adalah **nama sumber data**.

   1. `type`Sumber data. Dalam contoh konsol, ini adalah **AWS Lambda fungsi**.

   1. The`lambda-config`, yang merupakan **Fungsi ARN** dalam contoh konsol.
**catatan**  
Ada parameter lain seperti `Region` yang harus dikonfigurasi tetapi biasanya akan default ke nilai konfigurasi CLI Anda.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-data-source --api-id abcdefghijklmnopqrstuvwxyz --name myFunction --type AWS_LAMBDA --lambda-config lambdaFunctionArn=arn:aws:lambda:us-west-2:102847592837:function:appsync-lambda-example
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "dataSource": {
           "dataSourceArn": "arn:aws:appsync:us-west-2:102847592837:apis/abcdefghijklmnopqrstuvwxyz/datasources/myFunction",
           "type": "AWS_LAMBDA",
           "name": "myFunction",
           "lambdaConfig": {
               "lambdaFunctionArn": "arn:aws:lambda:us-west-2:102847592837:function:appsync-lambda-example"
           }
       }
   }
   ```

1. Untuk memodifikasi atribut sumber data, jalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-data-source.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-data-source.html)perintah.

   Dengan pengecualian `api-id` parameter, parameter yang digunakan dalam `create-data-source` perintah akan ditimpa oleh nilai-nilai baru dari `update-data-source` perintah.

------

### Aktifkan penyelesai Lambda langsung
<a name="direct-lambda-enable-templates"></a>

Setelah membuat sumber data Lambda dan menyiapkan peran IAM yang sesuai untuk memungkinkan menjalankan fungsi, Anda dapat AWS AppSync menautkannya ke fungsi resolver atau pipeline. 

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di jendela **Resolvers**, pilih bidang atau operasi dan kemudian pilih tombol **Lampirkan**.

1. Di halaman **Create new resolver**, pilih fungsi Lambda dari daftar dropdown.

1. **Untuk memanfaatkan penyelesai Lambda langsung, konfirmasikan bahwa templat pemetaan permintaan dan respons dinonaktifkan di bagian Konfigurasi templat pemetaan.**

1. Pilih tombol **Simpan Resolver**.

------
#### [ CLI ]
+ Buat resolver dengan menjalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)

  Anda harus mengetikkan 6 parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. `type-name`Jenis dalam skema Anda.

  1. `field-name`Bidang dalam skema Anda.

  1. Nama`data-source-name`, atau fungsi Lambda Anda.

  1. Itu`request-mapping-template`, yang merupakan badan permintaan. Dalam contoh konsol, ini dinonaktifkan:

     ```
     " "
     ```

  1. Itu`response-mapping-template`, yang merupakan tubuh respons. Dalam contoh konsol, ini juga dinonaktifkan:

     ```
     " "
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-resolver --api-id abcdefghijklmnopqrstuvwxyz --type-name Subscription --field-name onCreateTodo --data-source-name LambdaTest --request-mapping-template " " --response-mapping-template " "
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "resolver": {
          "resolverArn": "arn:aws:appsync:us-west-2:102847592837:apis/abcdefghijklmnopqrstuvwxyz/types/Subscription/resolvers/onCreateTodo",
          "typeName": "Subscription",
          "kind": "UNIT",
          "fieldName": "onCreateTodo",
          "dataSourceName": "LambdaTest"
      }
  }
  ```

------

Ketika Anda menonaktifkan template pemetaan Anda, ada beberapa perilaku tambahan yang akan terjadi di AWS AppSync:
+ [Dengan menonaktifkan template pemetaan, Anda memberi sinyal AWS AppSync bahwa Anda menerima terjemahan data default yang ditentukan dalam referensi penyelesai Lambda Langsung.](resolver-mapping-template-reference-lambda.md#direct-lambda-resolvers)
+ [Dengan menonaktifkan template pemetaan permintaan, sumber data Lambda Anda akan menerima payload yang terdiri dari seluruh objek Context.](resolver-context-reference.md)
+ Dengan menonaktifkan template pemetaan respons, hasil pemanggilan Lambda Anda akan diterjemahkan tergantung pada versi templat pemetaan permintaan atau jika templat pemetaan permintaan juga dinonaktifkan. 

# Menguji dan men-debug resolver di AWS AppSync (VTL)
<a name="test-debug-resolvers"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

AWS AppSync mengeksekusi resolver pada bidang GraphQL terhadap sumber data. Seperti yang dijelaskan dalam [ikhtisar template pemetaan Resolver](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview), resolver berkomunikasi dengan sumber data dengan menggunakan bahasa templating. Ini memungkinkan Anda untuk menyesuaikan perilaku dan menerapkan logika dan kondisi sebelum dan sesudah berkomunikasi dengan sumber data. [Untuk panduan pemrograman gaya tutorial pengantar untuk menulis resolver, lihat panduan pemrograman template pemetaan Resolver.](resolver-mapping-template-reference-programming-guide.md#aws-appsync-resolver-mapping-template-reference-programming-guide)

Untuk membantu pengembang menulis, menguji, dan men-debug resolver ini, AWS AppSync konsol juga menyediakan alat untuk membuat permintaan dan respons GraphQL dengan data tiruan ke penyelesai bidang individual. Selain itu, Anda dapat melakukan kueri, mutasi, dan langganan di AWS AppSync konsol dan melihat aliran log terperinci dari Amazon CloudWatch dari seluruh permintaan. Ini termasuk hasil dari sumber data.

## Pengujian dengan data tiruan
<a name="testing-with-mock-data"></a>

Ketika resolver GraphQL dipanggil, itu berisi objek yang berisi informasi tentang `context` permintaan. Ini termasuk argumen dari klien, informasi identitas, dan data dari bidang GraphQL induk. Ini juga berisi hasil dari sumber data, yang dapat digunakan dalam template respons. Untuk informasi selengkapnya tentang struktur ini dan utilitas pembantu yang tersedia untuk digunakan saat pemrograman, lihat Referensi Konteks Template [Pemetaan Resolver](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference).

Saat menulis atau mengedit resolver, Anda dapat meneruskan objek *konteks *tiruan* atau pengujian* ke editor konsol. Ini memungkinkan Anda untuk melihat bagaimana permintaan dan template respons mengevaluasi tanpa benar-benar berjalan terhadap sumber data. Misalnya, Anda dapat lulus `firstname: Shaggy` argumen pengujian dan melihat bagaimana itu mengevaluasi saat menggunakan `$ctx.args.firstname` dalam kode template Anda. Anda juga dapat menguji evaluasi setiap pembantu utilitas seperti `$util.autoId()` atau`util.time.nowISO8601()`.

### Menguji penyelesai
<a name="test-a-resolver"></a>

Contoh ini akan menggunakan AWS AppSync konsol untuk menguji resolver.

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Jika Anda belum melakukannya, di bawah tipe dan di samping bidang, pilih **Lampirkan** untuk menambahkan resolver Anda.

   [Untuk informasi selengkapnya tentang cara membuat resolver conplete, lihat Mengonfigurasi resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html)

   Jika tidak, pilih resolver yang sudah ada di lapangan.

1. Di bagian atas halaman **Edit resolver**, **pilih Pilih konteks pengujian, pilih Buat konteks** **baru**.

1. Pilih objek konteks sampel atau isi JSON secara manual di jendela **konteks Eksekusi di bawah** ini.

1. Masukkan **nama konteks Teks**.

1. Pilih tombol **Simpan**.

1. Di bagian atas halaman **Edit Resolver**, pilih **Run** test.

Untuk contoh yang lebih praktis, misalkan Anda memiliki aplikasi yang menyimpan tipe `Dog` GraphQL yang menggunakan pembuatan ID otomatis untuk objek dan menyimpannya di Amazon DynamoDB. Anda juga ingin menulis beberapa nilai dari argumen mutasi GraphQL, dan hanya mengizinkan pengguna tertentu untuk melihat respons. Berikut ini menunjukkan seperti apa skema itu:

```
type Dog {
  breed: String
  color: String
}

type Mutation {
  addDog(firstname: String, age: Int): Dog
}
```

Saat Anda menambahkan resolver untuk `addDog` mutasi, Anda dapat mengisi objek konteks seperti contoh berikut. Berikut ini memiliki argumen dari klien `name` dan`age`, dan `username` diisi dalam `identity` objek:

```
{
    "arguments" : {
        "firstname": "Shaggy",
        "age": 4
    },
    "source" : {},
    "result" : {
        "breed" : "Miniature Schnauzer",
        "color" : "black_grey"
    },
    "identity": {
        "sub" : "uuid",
        "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}",
        "username" : "Nadia",
        "claims" : { },
        "sourceIp" :[  "x.x.x.x" ],
        "defaultAuthStrategy" : "ALLOW"
    }
}
```

Anda dapat menguji ini menggunakan templat pemetaan permintaan dan respons berikut:

 **Templat Permintaan** 

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "id" : { "S" : "$util.autoId()" }
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

 **Template Respon** 

```
#if ($context.identity.username == "Nadia")
  $util.toJson($ctx.result)
#else
  $util.unauthorized()
#end
```

Template yang dievaluasi memiliki data dari objek konteks pengujian Anda dan nilai yang dihasilkan dari`$util.autoId()`. Selain itu, jika Anda mengubah `username` ke nilai selain`Nadia`, hasilnya tidak akan dikembalikan karena pemeriksaan otorisasi akan gagal. Untuk informasi selengkapnya tentang kontrol akses berbutir halus, lihat Kasus [penggunaan otorisasi](security-authorization-use-cases.md#aws-appsync-security-authorization-use-cases).

### Menguji template pemetaan dengan's AWS AppSync APIs
<a name="testing-with-appsync-api"></a>

Anda dapat menggunakan perintah `EvaluateMappingTemplate` API untuk menguji template pemetaan Anda dari jarak jauh dengan data tiruan. Untuk memulai dengan perintah, pastikan Anda telah menambahkan `appsync:evaluateMappingTemplate` izin ke kebijakan Anda. Contoh:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "appsync:evaluateMappingTemplate",
            "Resource": "arn:aws:appsync:us-east-1:111122223333:*"
        }
    ]
}
```

------

Anda dapat memanfaatkan perintah dengan menggunakan [AWS CLI](https://aws.amazon.com/cli/)atau [AWS SDKs](https://aws.amazon.com/tools/). Misalnya, ambil `Dog` skema dan templat request/response pemetaannya dari bagian sebelumnya. Menggunakan CLI di stasiun lokal Anda, simpan template permintaan ke file bernama`request.vtl`, lalu simpan `context` objek ke file bernama. `context.json` Dari shell Anda, jalankan perintah berikut:

```
aws appsync evaluate-mapping-template --template file://request.vtl --context file://context.json
```

Perintah mengembalikan respon berikut:

```
{
  "evaluationResult": "{\n    \"version\" : \"2017-02-28\",\n    \"operation\" : \"PutItem\",\n    \"key\" : {\n        \"id\" : { \"S\" : \"afcb4c85-49f8-40de-8f2b-248949176456\" }\n    },\n    \"attributeValues\" : {\"firstname\":{\"S\":\"Shaggy\"},\"age\":{\"N\":4}}\n}\n"
}
```

`evaluationResult`Berisi hasil pengujian template yang Anda berikan dengan yang disediakan`context`. Anda juga dapat menguji template Anda menggunakan AWS SDKs. Berikut adalah contoh menggunakan AWS SDK untuk JavaScript V2: 

```
const AWS = require('aws-sdk')
const client = new AWS.AppSync({ region: 'us-east-2' })

const template = fs.readFileSync('./request.vtl', 'utf8')
const context = fs.readFileSync('./context.json', 'utf8')

client
  .evaluateMappingTemplate({ template, context })
  .promise()
  .then((data) => console.log(data))
```

Menggunakan SDK, Anda dapat dengan mudah menggabungkan pengujian dari rangkaian pengujian favorit Anda untuk memvalidasi perilaku template Anda. Sebaiknya buat pengujian menggunakan [Jest Testing Framework](https://jestjs.io/), tetapi rangkaian pengujian apa pun berfungsi. Cuplikan berikut menunjukkan validasi hipotetis berjalan. Perhatikan bahwa kami mengharapkan respons evaluasi menjadi JSON yang valid, jadi kami gunakan `JSON.parse` untuk mengambil JSON dari respons string:

```
const AWS = require('aws-sdk')
const fs = require('fs')
const client = new AWS.AppSync({ region: 'us-east-2' })

test('request correctly calls DynamoDB', async () => {
  const template = fs.readFileSync('./request.vtl', 'utf8')
  const context = fs.readFileSync('./context.json', 'utf8')
  const contextJSON = JSON.parse(context)
  
  const response = await client.evaluateMappingTemplate({ template, context }).promise()
  const result = JSON.parse(response.evaluationResult)
  
  expect(result.key.id.S).toBeDefined()
  expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname)
})
```

 Ini menghasilkan hasil sebagai berikut:

```
Ran all test suites.
> jest

PASS ./index.test.js
✓ request correctly calls DynamoDB (543 ms)

Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.511 s, estimated 2 s
```

## Mendebug kueri langsung
<a name="debugging-a-live-query"></a>

Tidak ada pengganti untuk end-to-end pengujian dan logging untuk men-debug aplikasi produksi. AWS AppSync memungkinkan Anda mencatat kesalahan dan detail permintaan lengkap menggunakan Amazon CloudWatch. Selain itu, Anda dapat menggunakan AWS AppSync konsol untuk menguji kueri GraphQL, mutasi, dan langganan serta data log streaming langsung untuk setiap permintaan kembali ke editor kueri untuk di-debug secara real time. Untuk langganan, log menampilkan informasi waktu koneksi.

Untuk melakukan ini, Anda harus mengaktifkan CloudWatch log Amazon terlebih dahulu, seperti yang dijelaskan dalam [Pemantauan dan pencatatan](monitoring.md#aws-appsync-monitoring). Selanjutnya, di AWS AppSync konsol, pilih tab **Queries dan kemudian masukkan kueri** GraphQL yang valid. Di bagian kanan bawah, klik dan seret jendela **Log** untuk membuka tampilan log. Di bagian atas halaman, pilih ikon panah putar untuk menjalankan kueri GraphQL Anda. Dalam beberapa saat, log permintaan dan respons lengkap Anda untuk operasi dialirkan ke bagian ini dan Anda dapat melihatnya di konsol.

# Mengkonfigurasi dan menggunakan resolver pipa di AWS AppSync (VTL)
<a name="pipeline-resolvers"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

AWS AppSync mengeksekusi resolver pada bidang GraphQL. Dalam beberapa kasus, aplikasi memerlukan eksekusi beberapa operasi untuk menyelesaikan satu bidang GraphQL. Dengan resolver pipeline, pengembang sekarang dapat membuat operasi yang disebut Fungsi dan menjalankannya secara berurutan. Pipeline resolver berguna untuk aplikasi yang, misalnya, memerlukan melakukan pemeriksaan otorisasi sebelum mengambil data untuk bidang.

Pipeline resolver terdiri dari template **Sebelum** pemetaan, template **After** mapping, dan daftar Functions. Setiap Fungsi memiliki template pemetaan **permintaan** dan **respons** yang dijalankan terhadap sumber data. Karena penyelesai pipa mendelegasikan eksekusi ke daftar fungsi, oleh karena itu tidak ditautkan ke sumber data apa pun. Resolver dan fungsi unit adalah primitif yang menjalankan operasi terhadap sumber data. Lihat [ikhtisar template pemetaan Resolver](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview) untuk informasi selengkapnya.

## Langkah 1: Membuat resolver pipa
<a name="create-a-pipeline-resolver"></a>

Di AWS AppSync konsol, buka halaman **Skema**.

Simpan skema berikut:

```
schema {
    query: Query
    mutation: Mutation
}

type Mutation {
    signUp(input: Signup): User
}

type Query {
    getUser(id: ID!): User
}

input Signup {
    username: String!
    email: String!
}

type User {
    id: ID!
    username: String
    email: AWSEmail
}
```

**Kita akan memasang resolver pipa ke bidang **SignUp** pada tipe Mutasi.** Pada tipe **Mutasi** di sisi kanan, pilih **Lampirkan** di sebelah bidang `signUp` mutasi. Pada halaman create resolver, klik **Actions**, lalu **Update** runtime. Pilih`Pipeline Resolver`, lalu pilih`VTL`, lalu pilih **Perbarui**. Halaman sekarang harus menampilkan tiga bagian: area teks **Sebelum memetakan template**, bagian **Fungsi**, dan area teks **template Setelah pemetaan**.

Pipeline resolver kami mendaftarkan pengguna dengan terlebih dahulu memvalidasi input alamat email dan kemudian menyimpan pengguna dalam sistem. **Kita akan merangkum validasi email di dalam fungsi ValidateEmail, dan menyimpan pengguna di dalam fungsi **SaveUser**.** **Fungsi **ValidateEmail** dijalankan terlebih dahulu, dan jika email valid, maka fungsi SaveUser dijalankan.**

Alur eksekusi adalah sebagai berikut:

1. Templat pemetaan permintaan resolver mutation.signup

1. fungsi ValidateEmail

1. Fungsi SaveUser

1. Templat pemetaan respons penyelesai mutasi.signup

Karena kami mungkin akan menggunakan kembali fungsi **ValidateEmail** di resolver lain di API kami, kami ingin menghindari mengakses `$ctx.args` karena ini akan berubah dari satu bidang GraphQL ke bidang GraphQL lainnya. Sebagai gantinya, kita dapat menggunakan `$ctx.stash` untuk menyimpan atribut email dari argumen field `signUp(input: Signup)` input.

**SEBELUM** template pemetaan:

```
## store email input field into a generic email key
$util.qr($ctx.stash.put("email", $ctx.args.input.email))
{}
```

Konsol menyediakan passthrough default **setelah** template pemetaan yang akan kita gunakan:

```
$util.toJson($ctx.result)
```

Pilih **Buat** atau **Simpan** untuk memperbarui resolver.

## Langkah 2: Membuat fungsi
<a name="create-a-function"></a>

Dari halaman resolver pipeline, di bagian **Functions**, klik **Add function**, lalu **Create new** function. Dimungkinkan juga untuk membuat fungsi tanpa melalui halaman resolver; untuk melakukan ini, di AWS AppSync konsol, buka halaman **Fungsi**. Pilih tombol **Create Function**. Mari buat fungsi yang memeriksa apakah email valid dan berasal dari domain tertentu. Jika email tidak valid, fungsi tersebut menimbulkan kesalahan. Jika tidak, itu meneruskan input apa pun yang diberikan.

Pada halaman fungsi baru, pilih **Tindakan**, lalu **Perbarui runtime**. Pilih`VTL`, lalu **Perbarui**. Pastikan Anda telah membuat sumber data dari tipe **NONE**. Pilih sumber data ini di daftar **Nama sumber data**. Untuk **nama fungsi**, masukkan`validateEmail`. Di area **kode fungsi**, timpa semuanya dengan cuplikan ini:

```
#set($valid = $util.matches("^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com", $ctx.stash.email))
#if (!$valid)
    $util.error("$ctx.stash.email is not a valid email.")
#end
{
    "payload": { "email": $util.toJson(${ctx.stash.email}) }
}
```

Tempelkan ini ke template pemetaan respons:

```
$util.toJson($ctx.result)
```

Tinjau perubahan Anda, lalu pilih **Buat**. Kami baru saja membuat fungsi **ValidateEmail** kami. ****Ulangi langkah-langkah ini untuk membuat fungsi SaveUser dengan template pemetaan permintaan dan respons berikut (Demi kesederhanaan, kami menggunakan sumber data NONE dan berpura-pura pengguna telah disimpan dalam sistem setelah fungsi dijalankan.**** ): 

Permintaan template pemetaan:

```
## $ctx.prev.result contains the signup input values. We could have also
## used $ctx.args.input.
{
    "payload": $util.toJson($ctx.prev.result)
}
```

Templat pemetaan respons:

```
## an id is required so let's add a unique random identifier to the output
$util.qr($ctx.result.put("id", $util.autoId()))
$util.toJson($ctx.result)
```

Kami baru saja membuat fungsi **SaveUser** kami.

## Langkah 3: Menambahkan fungsi ke resolver pipa
<a name="adding-a-function-to-a-pipeline-resolver"></a>

Fungsi kita seharusnya ditambahkan secara otomatis ke resolver pipeline yang baru saja kita buat. Jika ini bukan masalahnya, atau Anda membuat fungsi melalui halaman **Fungsi**, Anda dapat mengklik **Tambahkan fungsi** pada halaman resolver untuk melampirkannya. Tambahkan fungsi **ValidateEmail** **dan SaveUser ke resolver**. **Fungsi **ValidateEmail** harus ditempatkan sebelum fungsi SaveUser.** Saat Anda menambahkan lebih banyak fungsi, Anda dapat menggunakan opsi **pindah ke atas** dan **bergerak ke bawah** untuk mengatur ulang urutan eksekusi fungsi Anda. Tinjau perubahan Anda, lalu pilih **Simpan**.

## Langkah 4: Menjalankan kueri
<a name="executing-a-query"></a>

Di AWS AppSync konsol, buka halaman **Kueri.** Di penjelajah, pastikan Anda menggunakan mutasi Anda. Jika tidak, pilih `Mutation` di daftar drop-down, lalu pilih`+`. Masukkan kueri berikut:

```
mutation {
  signUp(input: {
    email: "nadia@myvaliddomain.com"
    username: "nadia"
  }) {
    id
    email
  }
}
```

Ini harus mengembalikan sesuatu seperti:

```
{
  "data": {
    "signUp": {
      "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc",
      "email": "nadia@myvaliddomain.com"
    }
  }
}
```

Kami telah berhasil mendaftarkan pengguna kami dan memvalidasi email input menggunakan resolver pipeline. Untuk mengikuti tutorial yang lebih lengkap yang berfokus pada resolver pipeline, Anda dapat pergi ke [Tutorial:](tutorial-pipeline-resolvers.md#aws-appsync-tutorial-pipeline-resolvers) Pipeline Resolvers 