

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

# AWS AppSync JavaScript ikhtisar penyelesai
<a name="resolver-reference-overview-js"></a>

AWS AppSync memungkinkan Anda menanggapi permintaan GraphQL dengan melakukan operasi pada sumber data Anda. Untuk setiap bidang GraphQL yang ingin Anda jalankan kueri, mutasi, atau langganan, resolver harus dilampirkan.

Resolver adalah konektor antara GraphQL dan sumber data. Mereka memberi tahu AWS AppSync cara menerjemahkan permintaan GraphQL yang masuk ke dalam instruksi untuk sumber data backend Anda dan bagaimana menerjemahkan respons dari sumber data itu kembali ke respons GraphQL. Dengan AWS AppSync, Anda dapat menulis resolver Anda menggunakan JavaScript dan menjalankannya di lingkungan AWS AppSync (`APPSYNC_JS`). 

AWS AppSync memungkinkan Anda untuk menulis resolver unit atau resolver pipa yang terdiri dari beberapa AWS AppSync fungsi dalam pipa.

## Fitur runtime yang didukung
<a name="runtime-support-js"></a>

 AWS AppSync JavaScript Runtime menyediakan subset JavaScript pustaka, utilitas, dan fitur. Untuk daftar lengkap fitur dan fungsionalitas yang didukung oleh `APPSYNC_JS` runtime, lihat [fitur JavaScript runtime untuk resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) dan fungsi.

## Penyelesai unit
<a name="unit-resolver-js"></a>

Unit resolver terdiri dari kode yang mendefinisikan permintaan dan respon handler yang dijalankan terhadap sumber data. Handler permintaan mengambil objek konteks sebagai argumen dan mengembalikan payload permintaan yang digunakan untuk memanggil sumber data Anda. Response handler menerima payload kembali dari sumber data dengan hasil dari permintaan yang dieksekusi. Response handler mengubah payload menjadi respons GraphQL untuk menyelesaikan bidang GraphQL. Dalam contoh di bawah ini, resolver mengambil item dari sumber data DynamoDB:

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

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

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

## Anatomi penyelesai JavaScript pipa
<a name="anatomy-of-a-pipeline-resolver-js"></a>

Pipeline resolver terdiri dari kode yang mendefinisikan permintaan dan respon handler dan daftar fungsi. Setiap fungsi memiliki **permintaan** dan **respon** handler yang dijalankan terhadap sumber data. Karena delegasi penyelesai pipa berjalan 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.

### Penangan permintaan penyelesai pipa
<a name="request-handler-js"></a>

Handler permintaan dari resolver pipeline (langkah sebelumnya) memungkinkan Anda untuk melakukan beberapa logika persiapan sebelum menjalankan fungsi yang ditentukan.

### Daftar fungsi
<a name="functions-list-js"></a>

Daftar fungsi resolver pipeline akan berjalan secara berurutan. Hasil evaluasi penangan permintaan penyelesai pipa tersedia untuk fungsi pertama sebagai. `ctx.prev.result` Setiap hasil evaluasi fungsi tersedia untuk fungsi berikutnya sebagai`ctx.prev.result`.

### Penangan respons penyelesai pipa
<a name="response-handler-js"></a>

Response handler dari pipeline resolver memungkinkan Anda untuk melakukan beberapa logika akhir dari output fungsi terakhir ke tipe bidang GraphQL yang diharapkan. Output dari fungsi terakhir dalam daftar fungsi tersedia di pengendali respons penyelesai pipa sebagai atau. `ctx.prev.result` `ctx.result`

### Aliran eksekusi
<a name="execution-flow-js"></a>

Mengingat resolver pipeline yang terdiri dari dua fungsi, daftar di bawah ini mewakili alur eksekusi saat resolver dipanggil:

1.  Penangan permintaan penyelesai pipa

1.  Fungsi 1: Fungsi permintaan handler 

1.  Fungsi 1: Pemanggilan sumber data 

1.  Fungsi 1: Fungsi respon handler 

1.  Fungsi 2: Fungsi permintaan handler 

1.  Fungsi 2: Pemanggilan sumber data 

1.  Fungsi 2: Fungsi respon handler 

1.  Penangan respons penyelesai pipa 

![\[GraphQL request flow diagram showing interactions between request, data sources, and response components.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/appsync-js-resolver-logic.png)


### Utilitas bawaan `APPSYNC_JS` runtime yang berguna
<a name="useful-utilities-js"></a>

Utilitas berikut dapat membantu Anda ketika Anda bekerja dengan resolver pipa.

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

Stash adalah objek yang tersedia di dalam setiap resolver dan permintaan fungsi dan penangan respons. Instans simpanan yang sama hidup melalui satu resolver run. Ini berarti Anda dapat menggunakan stash untuk meneruskan data arbitrer di seluruh penangan permintaan dan respons dan di seluruh fungsi dalam resolver pipeline. Anda dapat menguji simpanan seperti JavaScript objek biasa.

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

`ctx.prev.result`Ini merupakan hasil dari operasi sebelumnya yang dieksekusi dalam pipa. Jika operasi sebelumnya adalah penangan permintaan resolver pipa, maka `ctx.prev.result` tersedia untuk fungsi pertama dalam rantai. Jika operasi sebelumnya adalah fungsi pertama, maka `ctx.prev.result` mewakili output dari fungsi pertama dan tersedia untuk fungsi kedua dalam pipa. Jika operasi sebelumnya adalah fungsi terakhir, maka `ctx.prev.result` mewakili output dari fungsi terakhir dan tersedia untuk pengendali respon resolver pipeline.

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

`util.error`Utilitas ini berguna untuk melempar kesalahan bidang. Menggunakan `util.error` di dalam permintaan fungsi atau penangan respons akan segera menimbulkan kesalahan bidang, yang mencegah fungsi berikutnya dieksekusi. Untuk detail selengkapnya dan `util.error` tanda tangan lainnya, kunjungi [fitur JavaScript runtime untuk resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) dan fungsi.

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

`util.appendError`mirip dengan`util.error()`, dengan perbedaan utama bahwa itu tidak mengganggu evaluasi handler. Sebaliknya, ini menandakan ada kesalahan dengan bidang, tetapi memungkinkan penangan untuk dievaluasi dan akibatnya mengembalikan data. Menggunakan fungsi `util.appendError` di dalam tidak akan mengganggu aliran eksekusi pipa. Untuk detail selengkapnya dan `util.error` tanda tangan lainnya, kunjungi [fitur JavaScript runtime untuk resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) dan fungsi.

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

`runtime.earlyReturn`Fungsi ini memungkinkan Anda untuk kembali sebelum waktunya dari fungsi permintaan apa pun. Menggunakan `runtime.earlyReturn` bagian dalam penangan permintaan resolver akan kembali dari resolver. Memanggilnya dari penangan permintaan AWS AppSync fungsi akan kembali dari fungsi dan akan melanjutkan proses ke fungsi berikutnya di pipeline atau penangan respons resolver.

### Menulis resolver pipa
<a name="writing-resolvers"></a>

Penyelesai pipa juga memiliki permintaan dan penangan respons yang mengelilingi fungsi dalam pipeline: penangan permintaannya dijalankan sebelum permintaan fungsi pertama, dan penangan responsnya dijalankan setelah respons fungsi terakhir. Handler permintaan resolver dapat mengatur data yang akan digunakan oleh fungsi dalam pipeline. Handler respons resolver bertanggung jawab untuk mengembalikan data yang dipetakan ke tipe keluaran bidang GraphQL. Dalam contoh di bawah ini, penangan permintaan resolver, mendefinisikan`allowedGroups`; data yang dikembalikan harus milik salah satu grup ini. Nilai ini dapat digunakan oleh fungsi resolver untuk meminta data. Response handler resolver melakukan pemeriksaan akhir dan memfilter hasilnya untuk memastikan bahwa hanya item milik grup yang diizinkan yang dikembalikan.

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

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

#### AWS AppSync Fungsi menulis
<a name="writing-functions"></a>

AWS AppSync fungsi memungkinkan Anda untuk menulis logika umum yang dapat Anda gunakan kembali di beberapa resolver dalam skema Anda. Misalnya, Anda dapat memiliki satu AWS AppSync fungsi `QUERY_ITEMS` yang dipanggil yang bertanggung jawab untuk menanyakan item dari sumber data Amazon DynamoDB. Untuk resolver yang ingin Anda kueri dengan item, cukup tambahkan fungsi ke pipeline resolver dan berikan indeks kueri yang akan digunakan. Logika tidak harus diimplementasikan kembali.

## Topik tambahan
<a name="supplemental-topics"></a>

**Topik**
+ [Contoh pipeline resolver dengan Amazon DynamoDB](https://docs.aws.amazon.com/appsync/latest/devguide/writing-code.html)
+ [Mengkonfigurasi utilitas untuk runtime `APPSYNC_JS`](https://docs.aws.amazon.com/appsync/latest/devguide/utility-resolvers.html)
+ [Bundling, TypeScript, dan peta sumber untuk runtime `APPSYNC_JS`](https://docs.aws.amazon.com/appsync/latest/devguide/additional-utilities.html)
+ [Menguji resolver dan penangan fungsi Anda](https://docs.aws.amazon.com/appsync/latest/devguide/test-resolvers.html)
+ [Migrasi dari VTL ke JavaScript](https://docs.aws.amazon.com/appsync/latest/devguide/migrating-resolvers.html)
+ [Memilih antara akses sumber data langsung dan proxy melalui sumber data Lambda](https://docs.aws.amazon.com/appsync/latest/devguide/choosing-data-source.html)

# Contoh pipeline resolver dengan Amazon DynamoDB
<a name="writing-code"></a>

Misalkan Anda ingin melampirkan resolver pipeline pada bidang bernama `getPost(id:ID!)` yang mengembalikan `Post` tipe dari sumber data Amazon DynamoDB dengan kueri GraphQL berikut:

```
getPost(id:1){
    id
    title
    content
}
```

Pertama, lampirkan resolver sederhana `Query.getPost` dengan kode di bawah ini. Ini adalah contoh kode resolver sederhana. Tidak ada logika yang didefinisikan dalam penangan permintaan, dan penangan respons hanya mengembalikan hasil dari fungsi terakhir.

```
/**
 * Invoked **before** the request handler of the first AppSync function in the pipeline.
 * The resolver `request` handler allows to perform some preparation logic
 * before executing the defined functions in your pipeline.
 * @param ctx the context object holds contextual information about the function invocation.
 */
export function request(ctx) {
  return {}
}

/**
 * Invoked **after** the response handler of the last AppSync function in the pipeline.
 * The resolver `response` handler allows to perform some final evaluation logic
 * from the output of the last function to the expected GraphQL field type.
 * @param ctx the context object holds contextual information about the function invocation.
 */
export function response(ctx) {
  return ctx.prev.result
}
```

Selanjutnya, tentukan fungsi `GET_ITEM` yang mengambil postitem dari sumber data Anda:

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

/**
 * Request a single item from the attached DynamoDB table datasource
 * @param ctx the context object holds contextual information about the function invocation.
 */
export function request(ctx) {
	const { id } = ctx.args
	return ddb.get({ key: { id } })
}

/**
 * Returns the result
 * @param ctx the context object holds contextual information about the function invocation.
 */
export function response(ctx) {
	const { error, result } = ctx
	if (error) {
		return util.appendError(error.message, error.type, result)
	}
	return ctx.result
}
```

Jika ada kesalahan selama permintaan, penangan respons fungsi menambahkan kesalahan yang akan dikembalikan ke klien pemanggil dalam respons GraphQL. Tambahkan `GET_ITEM` fungsi ke daftar fungsi resolver Anda. Saat Anda menjalankan kueri, penangan permintaan `GET_ITEM` fungsi menggunakan utilitas yang disediakan oleh modul AWS AppSync DynamoDB untuk membuat `DynamoDBGetItem` permintaan menggunakan sebagai kunci. `id` `ddb.get({ key: { id } })`menghasilkan `GetItem` operasi yang sesuai:

```
{
    "operation" : "GetItem",
    "key" : {
        "id" : { "S" : "1" }
    }
}
```

AWS AppSync menggunakan permintaan untuk mengambil data dari Amazon DynamoDB. Setelah data dikembalikan, itu ditangani oleh penangan respons `GET_ITEM` fungsi, yang memeriksa kesalahan dan kemudian mengembalikan hasilnya. 

```
{
  "result" : {
    "id": 1,
    "title": "hello world",
    "content": "<long story>"
  }
}
```

Akhirnya, handler respon resolver mengembalikan hasilnya secara langsung.

## Bekerja dengan kesalahan
<a name="working-with-errors"></a>

Jika terjadi kesalahan dalam fungsi Anda selama permintaan, kesalahan akan tersedia di pengendali respons fungsi Anda di`ctx.error`. Anda dapat menambahkan kesalahan ke respons GraphQL Anda menggunakan utilitas. `util.appendError` Anda dapat membuat kesalahan tersedia untuk fungsi lain dalam pipeline dengan menggunakan simpanan. Lihat contoh di bawah ini:

```
/**
 * Returns the result
 * @param ctx the context object holds contextual information about the function invocation.
 */
export function response(ctx) {
  const { error, result } = ctx;
  if (error) {
    if (!ctx.stash.errors) ctx.stash.errors = []
    ctx.stash.errors.push(ctx.error)
    return util.appendError(error.message, error.type, result);
  }
  return ctx.result;
}
```

# Mengkonfigurasi utilitas untuk runtime `APPSYNC_JS`
<a name="utility-resolvers"></a>

AWS AppSync menyediakan dua pustaka yang membantu dalam pengembangan resolver dengan runtime: `APPSYNC_JS` 
+ `@aws-appsync/eslint-plugin`- Menangkap dan memperbaiki masalah dengan cepat selama pengembangan.
+ `@aws-appsync/utils`- Menyediakan validasi tipe dan pelengkapan otomatis di editor kode.

## Mengkonfigurasi plugin eslint
<a name="utility-resolvers-configuring-eslint-plugin"></a>

[ESLint](https://eslint.org/)adalah alat yang menganalisis kode Anda secara statis untuk menemukan masalah dengan cepat. Anda dapat menjalankan ESLint sebagai bagian dari pipeline integrasi berkelanjutan Anda. `@aws-appsync/eslint-plugin`adalah ESLint plugin yang menangkap sintaks yang tidak valid dalam kode Anda saat memanfaatkan runtime. `APPSYNC_JS` Plugin ini memungkinkan Anda untuk dengan cepat mendapatkan umpan balik tentang kode Anda selama pengembangan tanpa harus mendorong perubahan Anda ke cloud.

`@aws-appsync/eslint-plugin`menyediakan dua set aturan yang dapat Anda gunakan selama pengembangan. 

**“plugin: @aws -appsync/base”** mengonfigurasi seperangkat aturan dasar yang dapat Anda manfaatkan dalam proyek Anda: 


| Aturan | Deskripsi | 
| --- | --- | 
| tidak-asinkron | Proses dan janji asinkron tidak didukung. | 
| tidak-menunggu | Proses dan janji asinkron tidak didukung. | 
| tidak ada kelas | Kelas tidak didukung. | 
| tidak-untuk | fortidak didukung (kecuali untuk for-in danfor-of, yang didukung) | 
| tidak lanjutkan | continue tidak didukung. | 
| tidak ada generator | Generator tidak didukung. | 
| tanpa hasil | yield tidak didukung. | 
| tanpa label | Label tidak didukung. | 
| tidak-ini | thisKata kunci tidak didukung. | 
| tidak mencoba | Struktur coba/tangkap tidak didukung. | 
| tidak-sementara | Sementara loop tidak didukung. | 
| no-disallowed-unary-operators | \$1\$1,--, dan operator \$1 unary tidak diizinkan. | 
| no-disallowed-binary-operators | instanceofOperator tidak diperbolehkan. | 
| tidak ada janji | Proses dan janji asinkron tidak didukung. | 

**“plugin: @aws -appsync/recommended”** menyediakan beberapa aturan tambahan tetapi juga mengharuskan Anda untuk menambahkan TypeScript konfigurasi ke proyek Anda.


| Aturan | Deskripsi | 
| --- | --- | 
| tidak ada rekursi | Panggilan fungsi rekursif tidak diperbolehkan. | 
| no-disallowed-methods | Beberapa metode tidak diperbolehkan. Lihat [referensi](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) untuk set lengkap fungsi bawaan yang didukung. | 
| no-function-passing | Melewati fungsi sebagai argumen fungsi ke fungsi tidak diperbolehkan. | 
| no-function-reassign | Fungsi tidak dapat dipindahkan. | 
| no-function-return | Fungsi tidak dapat menjadi nilai kembali fungsi. | 

Untuk menambahkan plugin ke proyek Anda, ikuti langkah-langkah instalasi dan penggunaan di [Memulai dengan ESLint](https://eslint.org/docs/latest/user-guide/getting-started#installation-and-usage). Kemudian, instal [plugin](https://www.npmjs.com/package/@aws-appsync/eslint-plugin) di proyek Anda menggunakan manajer paket proyek Anda (misalnya, npm, yarn, atau pnpm):

```
$ npm install @aws-appsync/eslint-plugin
```

Di `.eslintrc.{js,yml,json}` file Anda, tambahkan **“plugin: @aws -appsync/base” atau **“plugin: @aws -appsync/recommended**”** ke properti. `extends` Cuplikan di bawah ini adalah `.eslintrc` konfigurasi sampel dasar untuk: JavaScript 

```
{
  "extends": ["plugin:@aws-appsync/base"]
}
```

Untuk menggunakan set aturan **“plugin: @aws -appsync/recommended”**, instal ketergantungan yang diperlukan:

```
$ npm install -D @typescript-eslint/parser
```

Kemudian, buat `.eslintrc.js` file:

```
{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2018,
    "project": "./tsconfig.json"
  },
  "extends": ["plugin:@aws-appsync/recommended"]
}
```

# Bundling, TypeScript, dan peta sumber untuk runtime `APPSYNC_JS`
<a name="additional-utilities"></a>

TypeScript meningkatkan AWS AppSync pengembangan dengan menyediakan keamanan tipe dan deteksi kesalahan dini. Anda dapat menulis TypeScript kode secara lokal dan mentranspilasinya JavaScript sebelum menggunakannya dengan runtime. `APPSYNC_JS` Prosesnya dimulai dengan menginstal TypeScript dan mengonfigurasi tsconfig.json untuk lingkungan. `APPSYNC_JS` Anda kemudian dapat menggunakan alat bundling seperti esbuild untuk mengkompilasi dan menggabungkan kode. Amplify CLI akan menghasilkan tipe dari skema GraphQL, memungkinkan Anda untuk menggunakan tipe ini dalam kode resolver. 

Anda dapat memanfaatkan pustaka kustom dan eksternal dalam resolver dan kode fungsi Anda, selama mereka memenuhi persyaratan. `APPSYNC_JS` Alat bundling menggabungkan kode menjadi satu file untuk digunakan. AWS AppSync Peta sumber dapat disertakan untuk membantu debugging. 

## Memanfaatkan pustaka dan menggabungkan kode Anda
<a name="using-external-libraries"></a>

Dalam resolver dan kode fungsi Anda, Anda dapat memanfaatkan pustaka kustom dan eksternal selama mereka memenuhi persyaratan. `APPSYNC_JS` Hal ini memungkinkan untuk menggunakan kembali kode yang ada dalam aplikasi Anda. Untuk menggunakan pustaka yang ditentukan oleh beberapa file, Anda harus menggunakan alat bundling, seperti [esbuild](https://esbuild.github.io/), untuk menggabungkan kode Anda dalam satu file yang kemudian dapat disimpan ke AWS AppSync resolver atau fungsi Anda.

Saat menggabungkan kode Anda, ingatlah hal berikut:
+ `APPSYNC_JS`hanya mendukung ECMAScript modul (ESM).
+ `@aws-appsync/*`modul diintegrasikan ke dalam `APPSYNC_JS` dan tidak boleh dibundel dengan kode Anda.
+ Lingkungan `APPSYNC_JS` runtime mirip dengan NodeJS dalam kode itu tidak berjalan di lingkungan browser.
+ Anda dapat menyertakan peta sumber opsional. Namun, jangan sertakan konten sumber.

  Untuk mempelajari lebih lanjut tentang peta sumber, lihat [Menggunakan peta sumber](#source-maps).

Misalnya, untuk menggabungkan kode resolver Anda yang terletak di`src/appsync/getPost.resolver.js`, Anda dapat menggunakan perintah esbuild CLI berikut:

```
$ esbuild --bundle \
--sourcemap=inline \
--sources-content=false \
--target=esnext \
--platform=node \
--format=esm \
--external:@aws-appsync/utils \
--outdir=out/appsync \
 src/appsync/getPost.resolver.js
```

## Membangun kode Anda dan bekerja dengan TypeScript
<a name="working-with-typescript"></a>

[TypeScript](https://www.typescriptlang.org/)adalah bahasa pemrograman yang dikembangkan oleh Microsoft yang menawarkan semua fitur bersama dengan sistem TypeScript pengetikan. JavaScript Anda dapat menggunakan TypeScript untuk menulis kode type-safe dan menangkap kesalahan dan bug pada waktu pembuatan sebelum menyimpan kode Anda. AWS AppSync`@aws-appsync/utils`Paket ini sepenuhnya diketik.

`APPSYNC_JS`Runtime tidak mendukung TypeScript secara langsung. Anda harus terlebih dahulu mentranspile TypeScript kode Anda ke JavaScript kode yang didukung `APPSYNC_JS` runtime sebelum menyimpan kode Anda. AWS AppSync Anda dapat menggunakannya TypeScript untuk menulis kode Anda di lingkungan pengembangan terintegrasi lokal (IDE), tetapi perhatikan bahwa Anda tidak dapat membuat TypeScript kode di AWS AppSync konsol.

Untuk memulai, pastikan Anda telah [TypeScript](https://www.typescriptlang.org/download)menginstal di proyek Anda. Kemudian, konfigurasikan pengaturan TypeScript transkompilasi Anda agar berfungsi dengan `APPSYNC_JS` runtime yang digunakan. [TSConfig](https://www.typescriptlang.org/tsconfig) Berikut adalah contoh `tsconfig.json` file dasar yang dapat Anda gunakan:

```
// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
   "noEmit": true,
   "moduleResolution": "node",
  }
}
```

Anda kemudian dapat menggunakan alat bundling seperti esbuild untuk mengkompilasi dan menggabungkan kode Anda. Misalnya, mengingat proyek dengan AWS AppSync kode Anda berada di`src/appsync`, Anda dapat menggunakan perintah berikut untuk mengkompilasi dan menggabungkan kode Anda:

```
$ esbuild --bundle \
--sourcemap=inline \
--sources-content=false \
--target=esnext \
--platform=node \
--format=esm \
--external:@aws-appsync/utils \
--outdir=out/appsync \
 src/appsync/**/*.ts
```

### Menggunakan Amplify codegen
<a name="working-with-amplify-codegen"></a>

Anda dapat menggunakan [Amplify CLI](https://docs.amplify.aws/cli/) untuk menghasilkan tipe untuk skema Anda. Dari direktori tempat `schema.graphql` file Anda berada, jalankan perintah berikut dan tinjau petunjuk untuk mengonfigurasi codegen Anda:

```
$  npx @aws-amplify/cli codegen add
```

Untuk membuat ulang codegen Anda dalam keadaan tertentu (misalnya, ketika skema Anda diperbarui), jalankan perintah berikut:

```
$ npx @aws-amplify/cli codegen
```

Anda kemudian dapat menggunakan tipe yang dihasilkan dalam kode resolver Anda. Misalnya, diberikan skema berikut:

```
type Todo {
  id: ID!
  title: String!
  description: String
}

type Mutation {
  createTodo(title: String!, description: String): Todo
}

type Query {
  listTodos: Todo
}
```

Anda dapat menggunakan tipe yang dihasilkan dalam AWS AppSync fungsi contoh berikut:

```
import { Context, util } from '@aws-appsync/utils'
import * as ddb from '@aws-appsync/utils/dynamodb'
import { CreateTodoMutationVariables, Todo } from './API' // codegen

export function request(ctx: Context<CreateTodoMutationVariables>) {
	ctx.args.description = ctx.args.description ?? 'created on ' + util.time.nowISO8601()
	return ddb.put<Todo>({ key: { id: util.autoId() }, item: ctx.args })
}

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

### Menggunakan obat generik di TypeScript
<a name="working-with-typescript-generics"></a>

Anda dapat menggunakan obat generik dengan beberapa jenis yang disediakan. Misalnya, cuplikan di bawah ini adalah `Todo` tipe:

```
export type Todo = {
  __typename: "Todo",
  id: string,
  title: string,
  description?: string | null,
};
```

Anda dapat menulis resolver untuk langganan yang memanfaatkan. `Todo` Di IDE Anda, definisi ketik dan petunjuk pelengkapan otomatis akan memandu Anda menggunakan utilitas `toSubscriptionFilter` transformasi dengan benar:

```
import { util, Context, extensions } from '@aws-appsync/utils'
import { Todo } from './API'

export function request(ctx: Context) {
  return {}
}

export function response(ctx: Context) {
  const filter = util.transform.toSubscriptionFilter<Todo>({
    title: { beginsWith: 'hello' },
    description: { contains: 'created' },
  })
  extensions.setSubscriptionFilter(filter)
  return null
}
```

## Linting bundel Anda
<a name="using-lint-with-bundles"></a>

Anda dapat secara otomatis lint bundel Anda dengan mengimpor plugin. `esbuild-plugin-eslint` Anda kemudian dapat mengaktifkannya dengan memberikan `plugins` nilai yang memungkinkan kemampuan eslint. Di bawah ini adalah cuplikan yang menggunakan esbuild JavaScript API dalam file bernama: `build.mjs`

```
/* eslint-disable */
import { build } from 'esbuild'
import eslint from 'esbuild-plugin-eslint'
import glob from 'glob'
const files = await glob('src/**/*.ts')

await build({
  format: 'esm',
  target: 'esnext',
  platform: 'node',
  external: ['@aws-appsync/utils'],
  outdir: 'dist/',
  entryPoints: files,
  bundle: true,
  plugins: [eslint({ useEslintrc: true })],
})
```

## Menggunakan peta sumber
<a name="source-maps"></a>

Anda dapat memberikan peta sumber inline (`sourcemap`) dengan JavaScript kode Anda. Peta sumber berguna ketika Anda bundel JavaScript atau TypeScript kode dan ingin melihat referensi ke file sumber input Anda di log dan pesan JavaScript kesalahan runtime Anda.

Anda `sourcemap` harus muncul di akhir kode Anda. Ini didefinisikan oleh satu baris komentar yang mengikuti format berikut:

```
//# sourceMappingURL=data:application/json;base64,<base64 encoded string>
```

Inilah contohnya:

```
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibGliLmpzIiwgImNvZGUuanMiXSwKICAibWFwcGluZ3MiOiAiO0FBQU8sU0FBUyxRQUFRO0FBQ3RCLFNBQU87QUFDVDs7O0FDRE8sU0FBUyxRQUFRLEtBQUs7QUFDM0IsU0FBTyxNQUFNO0FBQ2Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
```

Peta sumber dapat dibuat dengan esbuild. Contoh di bawah ini menunjukkan cara menggunakan esbuild JavaScript API untuk menyertakan peta sumber sebaris saat kode dibuat dan dibundel:

```
/* eslint-disable */
import { build } from 'esbuild'
import eslint from 'esbuild-plugin-eslint'
import glob from 'glob'
const files = await glob('src/**/*.ts')

await build({
  sourcemap: 'inline',
  sourcesContent: false,
  
  format: 'esm',
  target: 'esnext',
  platform: 'node',
  external: ['@aws-appsync/utils'],
  outdir: 'dist/',
  entryPoints: files,
  bundle: true,
  plugins: [eslint({ useEslintrc: true })],
})
```

Secara khusus, `sourcesContent` opsi `sourcemap` dan menentukan bahwa peta sumber harus ditambahkan sebaris di akhir setiap build tetapi tidak boleh menyertakan konten sumber. Sebagai konvensi, kami sarankan untuk tidak menyertakan konten sumber dalam Anda`sourcemap`. Anda dapat menonaktifkan ini di esbuild dengan menyetel `sources-content` ke`false`.

Untuk mengilustrasikan cara kerja peta sumber, tinjau contoh berikut di mana kode resolver mereferensikan fungsi pembantu dari pustaka pembantu. Kode berisi pernyataan log dalam kode resolver dan di pustaka pembantu:

**. /src/default.resolver.ts** (resolver Anda)

```
import { Context } from '@aws-appsync/utils'
import { hello, logit } from './helper'

export function request(ctx: Context) {
  console.log('start >')
  logit('hello world', 42, true)
  console.log('< end')
  return 'test'
}

export function response(ctx: Context): boolean {
  hello()
  return ctx.prev.result
}
```

**.src/helper.ts** (file pembantu)

```
export const logit = (...rest: any[]) => {
  // a special logger
  console.log('[logger]', ...rest.map((r) => `<${r}>`))
}

export const hello = () => {
  // This just returns a simple sentence, but it could do more.
  console.log('i just say hello..')
}
```

Saat Anda membangun dan menggabungkan file resolver, kode resolver Anda akan menyertakan peta sumber inline. Saat resolver Anda berjalan, entri berikut akan muncul di log: CloudWatch 

![\[CloudWatch log entries showing resolver code execution with inline source map information.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cloudwatch-sourcemap.jpeg)


Melihat entri di CloudWatch log, Anda akan melihat bahwa fungsionalitas dari dua file telah dibundel bersama dan berjalan secara bersamaan. Nama file asli dari setiap file juga tercermin dengan jelas dalam log.

# Menguji resolver dan penangan fungsi Anda di AWS AppSync
<a name="test-resolvers"></a>

Anda dapat menggunakan perintah `EvaluateCode` API untuk menguji resolver dan penangan fungsi Anda dari jarak jauh dengan data tiruan sebelum menyimpan kode Anda ke resolver atau fungsi. Untuk memulai dengan perintah, pastikan Anda telah menambahkan `appsync:evaluatecode` 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://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/index.html) atau. [AWS SDKs](https://aws.amazon.com/tools/) Misalnya, untuk menguji kode Anda menggunakan CLI, cukup arahkan ke file Anda, berikan konteks, dan tentukan handler yang ingin Anda evaluasi:

```
aws appsync evaluate-code \
  --code file://code.js \
  --function request \
  --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 menyimpan 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": "{\"operation\":\"PutItem\",\"key\":{\"id\":{\"S\":\"record-id\"}},\"attributeValues\":{\"owner\":{\"S\":\"John doe\"},\"expectedVersion\":{\"N\":2},\"authorId\":{\"S\":\"Sammy Davis\"}}}",
    "logs": [
        "INFO - code.js:5:3: \"current id\" \"record-id\"",
        "INFO - code.js:9:3: \"request evaluated\""
    ]
}
```

Hasil evaluasi dapat diuraikan sebagai JSON, yang memberikan:

```
{
  "operation": "PutItem",
  "key": {
    "id": {
      "S": "record-id"
    }
  },
  "attributeValues": {
    "owner": {
      "S": "John doe"
    },
    "expectedVersion": {
      "N": 2
    },
    "authorId": {
      "S": "Sammy Davis"
    }
  }
}
```

Dengan menggunakan SDK, Anda dapat dengan mudah menggabungkan pengujian dari rangkaian pengujian untuk memvalidasi perilaku kode Anda. Contoh kami di sini 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
```

# Bermigrasi dari VTL ke in JavaScript AWS AppSync
<a name="migrating-resolvers"></a>

AWS AppSync memungkinkan Anda untuk menulis logika bisnis Anda untuk resolver dan fungsi Anda menggunakan VTL atau. JavaScript Dengan kedua bahasa, Anda menulis logika yang menginstruksikan AWS AppSync layanan tentang cara berinteraksi dengan sumber data Anda. Dengan VTL, Anda menulis template pemetaan yang harus mengevaluasi ke string yang dikodekan JSON yang valid. Dengan JavaScript, Anda menulis penangan permintaan dan respons yang mengembalikan objek. Anda tidak mengembalikan string yang dikodekan JSON.

Misalnya, ambil template pemetaan VTL berikut untuk mendapatkan item Amazon DynamoDB:

```
{
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
    }
}
```

Utilitas `$util.dynamodb.toDynamoDBJson` mengembalikan string JSON-encoded. Jika `$ctx.args.id` disetel ke`<id>`, template mengevaluasi ke string yang dikodekan JSON yang valid:

```
{
    "operation": "GetItem",
    "key": {
        "id": {"S": "<id>"},
    }
}
```

Saat bekerja dengan JavaScript, Anda tidak perlu mencetak string mentah yang disandikan JSON dalam kode Anda, dan menggunakan utilitas seperti tidak diperlukan. `toDynamoDBJson` Contoh yang setara dari template pemetaan di atas adalah:

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: {id: util.dynamodb.toDynamoDB(ctx.args.id)}
  };
}
```

Alternatifnya adalah menggunakan`util.dynamodb.toMapValues`, yang merupakan pendekatan yang direkomendasikan untuk menangani objek nilai:

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: util.dynamodb.toMapValues({ id: ctx.args.id }),
  };
}
```

Ini mengevaluasi untuk:

```
{
  "operation": "GetItem",
  "key": {
    "id": {
      "S": "<id>"
    }
  }
}
```

**catatan**  
Sebaiknya gunakan modul DynamoDB dengan sumber data DynamoDB:  

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

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

Sebagai contoh lain, ambil template pemetaan berikut untuk menempatkan item di sumber data Amazon DynamoDB:

```
{
    "operation" : "PutItem",
    "key" : {
        "id": $util.dynamodb.toDynamoDBJson($util.autoId()),
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

Saat dievaluasi, string template pemetaan ini harus menghasilkan string yang dikodekan JSON yang valid. Saat menggunakan JavaScript, kode Anda mengembalikan objek permintaan secara langsung:

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  const { id = util.autoId(), ...values } = ctx.args;
  return {
    operation: 'PutItem',
    key: util.dynamodb.toMapValues({ id }),
    attributeValues: util.dynamodb.toMapValues(values),
  };
}
```

yang mengevaluasi untuk:

```
{
  "operation": "PutItem",
  "key": {
    "id": { "S": "2bff3f05-ff8c-4ed8-92b4-767e29fc4e63" }
  },
  "attributeValues": {
    "firstname": { "S": "Shaggy" },
    "age": { "N": 4 }
  }
}
```

**catatan**  
Sebaiknya gunakan modul DynamoDB dengan sumber data DynamoDB:  

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

export function request(ctx) {
	const { id = util.autoId(), ...item } = ctx.args
	return ddb.put({ key: { id }, item })
}
```

# Memilih antara akses sumber data langsung dan proxy melalui sumber data Lambda
<a name="choosing-data-source"></a>

Dengan AWS AppSync dan `APPSYNC_JS` runtime, Anda dapat menulis kode Anda sendiri yang mengimplementasikan logika bisnis kustom Anda dengan menggunakan AWS AppSync fungsi untuk mengakses sumber data Anda. Ini memudahkan Anda untuk berinteraksi langsung dengan sumber data seperti Amazon DynamoDB, Aurora Tanpa OpenSearch Server, Layanan, HTTP APIs, AWS dan layanan lainnya tanpa harus menggunakan layanan atau infrastruktur komputasi tambahan. AWS AppSync juga memudahkan untuk berinteraksi dengan AWS Lambda fungsi dengan mengkonfigurasi sumber data Lambda. Sumber data Lambda memungkinkan Anda menjalankan logika bisnis yang kompleks menggunakan AWS Lambda kemampuan set lengkap untuk menyelesaikan permintaan GraphQL. Dalam kebanyakan kasus, AWS AppSync fungsi yang terhubung langsung ke sumber data targetnya akan menyediakan semua fungsionalitas yang Anda butuhkan. Dalam situasi di mana Anda perlu menerapkan logika bisnis kompleks yang tidak didukung oleh `APPSYNC_JS` runtime, Anda dapat menggunakan sumber data Lambda sebagai proxy untuk berinteraksi dengan sumber data target Anda.


|  |  |  | 
| --- |--- |--- |
|  | Integrasi sumber data langsung | Sumber data Lambda sebagai proxy | 
| Kasus penggunaan | AWS AppSync fungsi berinteraksi langsung dengan sumber data API. | AWS AppSync fungsi memanggil Lambdas yang berinteraksi dengan sumber data API. | 
| Waktu Aktif | APPSYNC\$1JS (JavaScript) | Setiap runtime Lambda yang didukung | 
| Ukuran maksimum kode | 32.000 karakter per fungsi AWS AppSync | 50 MB (zip, untuk diunggah langsung) per Lambda | 
| Modul eksternal | Terbatas - APPSYNC\$1JS hanya mendukung fitur | Ya | 
| Hubungi AWS layanan apa pun | Ya - Menggunakan sumber data AWS AppSync HTTP | Ya - Menggunakan AWS SDK | 
| Akses ke header permintaan | Ya | Ya | 
| Akses jaringan | Tidak | Ya | 
| Akses sistem file | Tidak | Ya | 
| Pencatatan dan metrik | Ya | Ya | 
| Membangun dan menguji sepenuhnya di dalam AppSync | Ya | Tidak | 
| Awal yang dingin | Tidak | Tidak - Dengan konkurensi yang disediakan | 
| Penskalaan otomatis | Ya - secara transparan oleh AWS AppSync | Ya - Seperti yang dikonfigurasi di Lambda | 
| Harga | Tidak ada biaya tambahan | Dibebankan untuk penggunaan Lambda | 

AWS AppSync fungsi yang terintegrasi langsung dengan sumber data target mereka ideal untuk kasus penggunaan seperti berikut:
+  Berinteraksi dengan Amazon DynamoDB, Aurora Tanpa Server, dan Layanan OpenSearch 
+  Berinteraksi dengan HTTP APIs dan meneruskan header yang masuk 
+  Berinteraksi dengan AWS layanan menggunakan sumber data HTTP (dengan AWS AppSync secara otomatis menandatangani permintaan dengan peran sumber data yang disediakan) 
+  Menerapkan kontrol akses sebelum mengakses sumber data 
+  Menerapkan penyaringan data yang diambil sebelum memenuhi permintaan 
+  Menerapkan orkestrasi sederhana dengan eksekusi AWS AppSync fungsi secara berurutan dalam pipa resolver 
+  Mengontrol koneksi caching dan berlangganan dalam kueri dan mutasi. 

AWS AppSync fungsi yang menggunakan sumber data Lambda sebagai proxy sangat ideal untuk kasus penggunaan seperti berikut:
+  Menggunakan bahasa selain JavaScript atau Velocity Template Language (VTL) 
+  Menyesuaikan dan mengendalikan CPU atau memori untuk mengoptimalkan kinerja 
+  Mengimpor pustaka pihak ketiga atau memerlukan fitur yang tidak didukung di `APPSYNC_JS` 
+  Membuat beberapa permintaan jaringan and/or mendapatkan akses sistem file untuk memenuhi kueri 
+  Permintaan batching menggunakan konfigurasi [batching](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-lambda-js.html). 