

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

# AWS AppSync referensi resolver () JavaScript
<a name="resolver-reference-js-version"></a>

Bagian berikut berisi referensi `APPSYNC_JS` runtime dan JavaScript resolver:
+  [ JavaScriptikhtisar resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html) - Pelajari lebih lanjut tentang cara kerja resolver. AWS AppSync
+  [Referensi objek konteks penyelesai - Pelajari lebih lanjut tentang objek konteks dan cara penggunaannya dalam resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html).
+  [ JavaScript fitur runtime untuk resolver dan fungsi](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) - Pelajari lebih lanjut tentang fitur runtime yang didukung dan menggunakan utilitas untuk menyederhanakan kode.
+  [ JavaScriptreferensi fungsi resolver untuk DynamoDB - Pelajari lebih lanjut tentang bagaimana resolver berinteraksi dengan DynamoDB](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html).
+  [ JavaScriptreferensi fungsi resolver untuk OpenSearch ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-elasticsearch-js.html) - Pelajari lebih lanjut tentang permintaan resolver dan struktur respons serta interaksi dengan Layanan. OpenSearch 
+  [ JavaScript referensi fungsi resolver untuk Lambda](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-lambda-js.html) - Pelajari lebih lanjut tentang permintaan resolver dan struktur respons serta interaksi dengan Lambda.
+  [ JavaScriptreferensi fungsi resolver untuk sumber EventBridge data](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-eventbridge-js.html) - Pelajari lebih lanjut tentang permintaan resolver dan struktur respons serta interaksi dengan. EventBridge
+  [ JavaScript referensi fungsi resolver untuk sumber data None](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-none-js.html) - Pelajari lebih lanjut tentang permintaan resolver dan struktur respons serta interaksi dengan sumber data NONE.
+  [ JavaScript referensi fungsi resolver untuk HTTP](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-http-js.html) - Pelajari lebih lanjut tentang permintaan resolver dan struktur respons serta interaksi dengan titik akhir HTTP.
+  [ JavaScript referensi fungsi resolver untuk Amazon RDS](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-rds-js.html) - Pelajari lebih lanjut tentang struktur resolver dan interaksi dengan RDS.
+  [ JavaScript referensi fungsi resolver untuk Amazon Bedrock](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-bedrock-js.html) - Pelajari lebih lanjut tentang struktur resolver dan interaksi dengan Amazon Bedrock.

# 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). 

# AWS AppSync JavaScript referensi objek konteks resolver
<a name="resolver-context-reference-js"></a>

AWS AppSync mendefinisikan satu set variabel dan fungsi untuk bekerja dengan permintaan dan penangan respon. Ini membuat operasi logis pada data lebih mudah dengan GraphQL. Dokumen ini menjelaskan fungsi-fungsi tersebut dan memberikan contoh.

## Mengakses `context`
<a name="accessing-the-context-js"></a>

`context`Argumen penangan permintaan dan respons adalah objek yang menyimpan semua informasi kontekstual untuk pemanggilan resolver Anda. Ini memiliki struktur sebagai berikut:

```
type Context = {
  arguments: any;
  args: any;
  identity: Identity;
  source: any;
  error?: {
    message: string;
    type: string;
  };
  stash: any;
  result: any;
  prev: any;
  request: Request;
  info: Info;
};
```

**catatan**  
Anda akan sering menemukan bahwa `context` objek tersebut disebut sebagai`ctx`.

Setiap bidang dalam `context` objek didefinisikan sebagai berikut:

### `context`bidang
<a name="accessing-the-context-list-js"></a>

** `arguments` **  
Peta yang berisi semua argumen GraphQL untuk bidang ini.

** `identity` **  
Objek yang berisi informasi tentang penelepon. Untuk informasi selengkapnya tentang struktur bidang ini, lihat [Identitas](#aws-appsync-resolver-context-reference-identity-js).

** `source` **  
Peta yang berisi resolusi bidang induk.

** `stash` **  
Stash adalah objek yang tersedia di dalam setiap resolver dan function handler. Objek 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 tidak dapat menghapus atau mengganti seluruh simpanan, tetapi Anda dapat menambahkan, memperbarui, menghapus, dan membaca properti simpanan. 
Anda dapat menambahkan item ke simpanan dengan memodifikasi salah satu contoh kode di bawah ini:  

```
//Example 1
ctx.stash.newItem = { key: "something" }

//Example 2
Object.assign(ctx.stash, {key1: value1, key2: value})
```
Anda dapat menghapus item dari simpanan dengan memodifikasi kode di bawah ini:  

```
delete ctx.stash.key
```

** `result` **  
Wadah untuk hasil resolver ini. Bidang ini hanya tersedia untuk penangan respons.  
Misalnya, jika Anda menyelesaikan `author` bidang kueri berikut:  

```
query {
    getPost(id: 1234) {
        postId
        title
        content
        author {
            id
            name
        }
    }
}
```
Kemudian `context` variabel lengkap tersedia ketika penangan respons dievaluasi:  

```
{
  "arguments" : {
    id: "1234"
  },
  "source": {},
  "result" : {
      "postId": "1234",
      "title": "Some title",
      "content": "Some content",
      "author": {
        "id": "5678",
        "name": "Author Name"
      }
  },
  "identity" : {
      "sourceIp" : ["x.x.x.x"],
      "userArn" : "arn:aws:iam::123456789012:user/appsync",
      "accountId" : "666666666666",
      "user" : "AIDAAAAAAAAAAAAAAAAAA"
  }
}
```

** `prev.result` **  
Hasil dari operasi apa pun sebelumnya dijalankan dalam resolver pipa.  
Jika operasi sebelumnya adalah penangan permintaan penyelesai pipa, maka `ctx.prev.result` mewakili hasil evaluasi tersebut dan tersedia untuk fungsi pertama dalam pipeline.  
Jika operasi sebelumnya adalah fungsi pertama, maka `ctx.prev.result` merupakan hasil evaluasi dari handler respons fungsi pertama dan tersedia untuk fungsi kedua dalam pipeline.  
Jika operasi sebelumnya adalah fungsi terakhir, maka `ctx.prev.result` mewakili hasil evaluasi dari fungsi terakhir dan tersedia untuk pengendali respons penyelesai pipa.

** `info` **  
Objek yang berisi informasi tentang permintaan GraphQL. Untuk struktur bidang ini, lihat [Info](#aws-appsync-resolver-context-reference-info-js).

### Identitas
<a name="aws-appsync-resolver-context-reference-identity-js"></a>

`identity`Bagian ini berisi informasi tentang penelepon. Bentuk bagian ini tergantung pada jenis otorisasi AWS AppSync API Anda.

Untuk informasi selengkapnya tentang opsi AWS AppSync keamanan, lihat [Otorisasi dan otentikasi](security-authz.md#aws-appsync-security).

** `API_KEY`otorisasi**  
`identity`Bidang tidak dihuni.

**`AWS_LAMBDA`otorisasi**  
Ini `identity` memiliki bentuk sebagai berikut:  

```
type AppSyncIdentityLambda = {
  resolverContext: any;
};
```
Berisi `resolverContext` kunci, `identity` berisi `resolverContext` konten yang sama yang dikembalikan oleh fungsi Lambda yang mengotorisasi permintaan.

** `AWS_IAM`otorisasi**  
Ini `identity` memiliki bentuk sebagai berikut:  

```
type AppSyncIdentityIAM = {
  accountId: string;
  cognitoIdentityPoolId: string;
  cognitoIdentityId: string;
  sourceIp: string[];
  username: string;
  userArn: string;
  cognitoIdentityAuthType: string;
  cognitoIdentityAuthProvider: string;
};
```

** `AMAZON_COGNITO_USER_POOLS`otorisasi**  
Ini `identity` memiliki bentuk sebagai berikut:  

```
type AppSyncIdentityCognito = {
  sourceIp: string[];
  username: string;
  groups: string[] | null;
  sub: string;
  issuer: string;
  claims: any;
  defaultAuthStrategy: string;
};
```

Setiap bidang didefinisikan sebagai berikut:

** `accountId` **  
ID AWS akun penelepon.

** `claims` **  
Klaim yang dimiliki pengguna.

** `cognitoIdentityAuthType` **  
Entah diautentikasi atau tidak diautentikasi berdasarkan tipe identitas.

** `cognitoIdentityAuthProvider` **  
Daftar informasi penyedia identitas eksternal yang dipisahkan koma yang digunakan dalam memperoleh kredensil yang digunakan untuk menandatangani permintaan.

** `cognitoIdentityId` **  
ID identitas Amazon Cognito dari penelepon.

** `cognitoIdentityPoolId` **  
ID kumpulan identitas Amazon Cognito yang terkait dengan pemanggil.

** `defaultAuthStrategy` **  
Strategi otorisasi default untuk penelepon ini (`ALLOW`atau`DENY`).

** `issuer` **  
Penerbit token.

** `sourceIp` **  
Alamat IP sumber penelepon yang AWS AppSync menerima. Jika permintaan tidak menyertakan `x-forwarded-for` header, nilai IP sumber hanya berisi satu alamat IP dari koneksi TCP. Jika permintaan menyertakan `x-forwarded-for` header, IP sumber adalah daftar alamat IP dari `x-forwarded-for` header, selain alamat IP dari koneksi TCP.

** `sub` **  
UUID dari pengguna yang diautentikasi.

** `user` **  
Pengguna IAM.

** `userArn` **  
Nama Sumber Daya Amazon (ARN) dari pengguna IAM.

** `username` **  
Nama pengguna dari pengguna yang diautentikasi. Dalam hal `AMAZON_COGNITO_USER_POOLS` otorisasi, nilai *nama pengguna adalah nilai atribut *cognito:username**. Dalam hal `AWS_IAM` otorisasi, nilai nama *pengguna* adalah nilai prinsipal AWS pengguna. Jika Anda menggunakan otorisasi IAM dengan kredensil yang dijual dari kumpulan identitas Amazon Cognito, kami sarankan Anda menggunakannya. `cognitoIdentityId`

### Akses header permintaan
<a name="aws-appsync-resolver-context-reference-util-js"></a>

AWS AppSync mendukung meneruskan header khusus dari klien dan mengaksesnya di resolver GraphQL Anda dengan menggunakan. `ctx.request.headers` Anda kemudian dapat menggunakan nilai header untuk tindakan seperti memasukkan data ke sumber data atau pemeriksaan otorisasi. Anda dapat menggunakan header permintaan tunggal atau beberapa menggunakan `$curl` kunci API dari baris perintah, seperti yang ditunjukkan pada contoh berikut:

**Contoh header tunggal** 

Misalkan Anda menetapkan header `custom` dengan nilai `nadia` seperti berikut:

```
curl -XPOST -H "Content-Type:application/graphql" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
```

Ini kemudian dapat diakses dengan`ctx.request.headers.custom`. Misalnya, mungkin dalam kode berikut untuk DynamoDB:

```
"custom": util.dynamodb.toDynamoDB(ctx.request.headers.custom)
```

**Beberapa contoh header** 

Anda juga dapat meneruskan beberapa header dalam satu permintaan dan mengaksesnya di penangan resolver. Misalnya, jika `custom` header diatur dengan dua nilai:

```
curl -XPOST -H "Content-Type:application/graphql" -H "custom:bailey" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
```

Anda kemudian dapat mengakses ini sebagai array, seperti`ctx.request.headers.custom[1]`.

**catatan**  
AWS AppSync tidak mengekspos header cookie di`ctx.request.headers`.

### Mengakses permintaan nama domain kustom
<a name="aws-access-requested-custom-domain-names-js"></a>

AWS AppSync mendukung konfigurasi domain kustom yang dapat Anda gunakan untuk mengakses GraphQL Anda dan titik akhir real-time untuk Anda. APIs Saat membuat permintaan dengan nama domain khusus, Anda bisa mendapatkan nama domain menggunakan`ctx.request.domainName`.

Saat menggunakan nama domain titik akhir GraphQL default, nilainya adalah. `null`

### Info
<a name="aws-appsync-resolver-context-reference-info-js"></a>

`info`Bagian ini berisi informasi tentang permintaan GraphQL. Bagian ini memiliki bentuk sebagai berikut:

```
type Info = {
  fieldName: string;
  parentTypeName: string;
  variables: any;
  selectionSetList: string[];
  selectionSetGraphQL: string;
};
```

Setiap bidang didefinisikan sebagai berikut:

** `fieldName` **  
Nama bidang yang saat ini sedang diselesaikan.

** `parentTypeName` **  
Nama tipe induk untuk bidang yang saat ini sedang diselesaikan.

** `variables` **  
Peta yang menampung semua variabel yang diteruskan ke permintaan GraphQL.

** `selectionSetList` **  
Sebuah daftar representasi bidang dalam set pilihan GraphQL. Bidang yang dialias hanya direferensikan dengan nama alias, bukan nama bidang. Contoh berikut menunjukkan ini secara rinci.

** `selectionSetGraphQL` **  
Sebuah representasi string dari set seleksi, diformat sebagai GraphQL skema definisi bahasa (SDL). Meskipun fragmen tidak digabungkan ke dalam kumpulan seleksi, fragmen sebaris dipertahankan, seperti yang ditunjukkan pada contoh berikut.

**catatan**  
`JSON.stringify`tidak akan menyertakan `selectionSetGraphQL` dan `selectionSetList` dalam serialisasi string. Anda harus mereferensikan properti ini secara langsung.

Misalnya, jika Anda menyelesaikan `getPost` bidang kueri berikut:

```
query {
  getPost(id: $postId) {
    postId
    title
    secondTitle: title
    content
    author(id: $authorId) {
      authorId
      name
    }
    secondAuthor(id: "789") {
      authorId
    }
    ... on Post {
      inlineFrag: comments: {
        id
      }
    }
    ... postFrag
  }
}

fragment postFrag on Post {
  postFrag: comments: {
    id
  }
}
```

Kemudian `ctx.info` variabel lengkap yang tersedia saat memproses handler mungkin:

```
{
  "fieldName": "getPost",
  "parentTypeName": "Query",
  "variables": {
    "postId": "123",
    "authorId": "456"
  },
  "selectionSetList": [
    "postId",
    "title",
    "secondTitle"
    "content",
    "author",
    "author/authorId",
    "author/name",
    "secondAuthor",
    "secondAuthor/authorId",
    "inlineFragComments",
    "inlineFragComments/id",
    "postFragComments",
    "postFragComments/id"
  ],
  "selectionSetGraphQL": "{\n  getPost(id: $postId) {\n    postId\n    title\n    secondTitle: title\n    content\n    author(id: $authorId) {\n      authorId\n      name\n    }\n    secondAuthor(id: \"789\") {\n      authorId\n    }\n    ... on Post {\n      inlineFrag: comments {\n        id\n      }\n    }\n    ... postFrag\n  }\n}"
}
```

`selectionSetList`mengekspos hanya bidang yang termasuk tipe saat ini. Jika tipe saat ini adalah antarmuka atau gabungan, hanya bidang yang dipilih milik antarmuka yang diekspos. Misalnya, diberikan skema berikut:

```
type Query {
    node(id: ID!): Node
}

interface Node {
    id: ID
}

type Post implements Node {
    id: ID
    title: String
    author: String
}

type Blog implements Node {
    id: ID
    title: String
    category: String
}
```

Dan query berikut:

```
query {
    node(id: "post1") {
        id
        ... on Post {
            title
        }

        ... on Blog {
            title
        }
    }
}
```

Saat memanggil `ctx.info.selectionSetList` pada resolusi `Query.node` bidang, hanya yang `id` diekspos:

```
"selectionSetList": [
    "id"
]
```

# AWS AppSync JavaScript fitur runtime untuk resolver dan fungsi
<a name="resolver-util-reference-js"></a>

Lingkungan `APPSYNC_JS` runtime menyediakan fungsionalitas yang mirip dengan [ECMAScript (ES) versi 6.0](https://262.ecma-international.org/6.0/). Ini mendukung subset fitur-fiturnya dan menyediakan beberapa metode tambahan (utilitas) yang bukan bagian dari spesifikasi ES. Topik berikut mencantumkan semua fitur bahasa yang didukung:
+  [Fitur runtime yang didukung](https://docs.aws.amazon.com/appsync/latest/devguide/supported-features.html) - Pelajari lebih lanjut tentang fitur inti yang didukung, objek primitif, objek dan fungsi bawaan, dll.
+  [Utilitas bawaan](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html) - Variabel util berisi metode utilitas umum untuk membantu Anda bekerja dengan data. Kecuali ditentukan lain, semua utilitas menggunakan set karakter UTF-8.
+  [Modul bawaan](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-modules-js.html) - Pelajari lebih lanjut tentang bagaimana modul bawaan dapat membantu menulis JavaScript resolver dan fungsi.
+  [Utilitas runtime](https://docs.aws.amazon.com/appsync/latest/devguide/runtime-utils-js.html) - Pustaka runtime menyediakan utilitas untuk mengontrol atau memodifikasi properti runtime dari resolver dan fungsi Anda.
+  [Pembantu waktu di util.time - Variabel util.time](https://docs.aws.amazon.com/appsync/latest/devguide/time-helpers-in-util-time-js.html) berisi metode datetime untuk membantu menghasilkan stempel waktu, mengonversi antara format datetime, dan mengurai string datetime. Sintaks untuk format datetime didasarkan pada [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html), yang dapat Anda referensikan untuk dokumentasi lebih lanjut.
+  [DynamoDB helpers di util.dynamodb](https://docs.aws.amazon.com/appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html) - util.dynamodb berisi metode pembantu yang memudahkan untuk menulis dan membaca data ke Amazon DynamoDB, seperti pemetaan dan pemformatan tipe otomatis.
+  [Pembantu HTTP di util.http](https://docs.aws.amazon.com/appsync/latest/devguide/http-helpers-in-utils-http-js.html) - Utilitas util.http menyediakan metode pembantu yang dapat Anda gunakan untuk mengelola parameter permintaan HTTP dan untuk menambahkan header respons.
+  [Pembantu transformasi di util.transform](https://docs.aws.amazon.com/appsync/latest/devguide/transformation-helpers-in-utils-transform-js.html) - util.transform berisi metode pembantu yang membuatnya lebih mudah untuk melakukan operasi kompleks terhadap sumber data.
+  [Pembantu string di util.str - util.str](https://docs.aws.amazon.com/appsync/latest/devguide/str-helpers-in-util-str-js.html) berisi metode untuk membantu operasi String umum.
+  [Ekstensi](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html) - ekstensi berisi serangkaian metode untuk membuat tindakan tambahan dalam resolver Anda.
+  [Pembantu XMLdi util.xml](https://docs.aws.amazon.com/appsync/latest/devguide/xml-helpers-in-util-xml-js.html) - util.xml berisi metode untuk membantu dengan konversi string XHTML.

**catatan**  
Saat ini, referensi ini hanya berlaku untuk runtime versi **1.0.0**.

# Fitur runtime yang didukung
<a name="supported-features"></a>

Bagian di bawah ini menjelaskan kumpulan fitur yang didukung dari runtime APPSYNC\$1JS.

## Fitur inti
<a name="core-features"></a>

Fitur inti berikut didukung.

------
#### [ Types ]

Jenis berikut didukung:
+ angka
+ tali
+ boolean
+ objek
+ larik
+ fungsi

------
#### [ Operators ]

Operator didukung, termasuk:
+ operator matematika standar (`+`,`-`,`/`,`%`,`*`, dll.)
+ operator penggabungan nullish () `??`
+ Rantai opsional () `?.`
+ operator bitwise
+ `void`dan `typeof` operator
+ operator penyebaran (`...`)

Operator berikut tidak didukung:
+ operator unary (`++`,`--`, dan`~`)
+ Operator `in`
**catatan**  
Gunakan `Object.hasOwn` operator untuk memeriksa apakah properti yang ditentukan ada di objek yang ditentukan.

------
#### [ Statements ]

Pernyataan berikut didukung:
+ `const`
+ `let`
+ `var`
+ `break`
+ `else`
+ `for-in`
+ `for-of` 
+ `if`
+ `return`
+ `switch`
+ sintaks spread

Berikut ini tidak didukung:
+ `catch`
+ `continue`
+ `do-while`
+ `finally`
+ `for(initialization; condition; afterthought)`
**catatan**  
Pengecualian adalah `for-in` dan `for-of` ekspresi, yang didukung.
+ `throw`
+ `try`
+ `while`
+ pernyataan berlabel

------
#### [ Literals ]

[Literal template](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) ES 6 berikut didukung:
+ String multi-baris
+ Interpolasi ekspresi
+ Template bersarang

------
#### [ Functions ]

Sintaks fungsi berikut didukung:
+ Deklarasi fungsi didukung.
+ Fungsi panah ES 6 didukung.
+ ES 6 sisanya sintaks parameter didukung.

------
#### [ Strict mode ]

Fungsi beroperasi dalam mode ketat secara default, sehingga Anda tidak perlu menambahkan pernyataan `use_strict` dalam kode fungsi Anda. Ini tidak dapat diubah.

------

## Objek primitif
<a name="primitive-objects"></a>

Objek primitif ES berikut dan fungsinya didukung.

------
#### [ Object ]

Objek berikut didukung:
+ `Object.assign()`
+ `Object.entries()` 
+ `Object.hasOwn()`
+ `Object.keys()` 
+ `Object.values()`
+ `delete` 

------
#### [ String ]

String berikut didukung:
+  `String.prototype.length()` 
+  `String.prototype.charAt()` 
+  `String.prototype.concat()` 
+  `String.prototype.endsWith()` 
+  `String.prototype.indexOf()` 
+  `String.prototype.lastIndexOf()` 
+  `String.raw()` 
+  `String.prototype.replace()`
**catatan**  
Ekspresi reguler tidak didukung.   
Namun, konstruksi ekspresi reguler bergaya Java didukung dalam parameter yang disediakan. Untuk informasi lebih lanjut lihat [Pola](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html).
+ `String.prototype.replaceAll()`
**catatan**  
Ekspresi reguler tidak didukung.  
Namun, konstruksi ekspresi reguler bergaya Java didukung dalam parameter yang disediakan. Untuk informasi lebih lanjut lihat [Pola](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html).
+  `String.prototype.slice()` 
+  `String.prototype.split()` 
+  `String.prototype.startsWith()` 
+  `String.prototype.toLowerCase()` 
+  `String.prototype.toUpperCase()` 
+  `String.prototype.trim()` 
+  `String.prototype.trimEnd()` 
+  `String.prototype.trimStart()` 

------
#### [ Number ]

Angka-angka berikut didukung:
+  `Number.isFinite` 
+  `Number.isNaN` 

------

## Objek dan fungsi bawaan
<a name="built-in-objects-functions"></a>

Fungsi dan objek berikut didukung.

------
#### [ Math ]

Fungsi matematika berikut didukung:
+  `Math.random()` 
+  `Math.min()` 
+  `Math.max()` 
+  `Math.round()` 
+  `Math.floor()` 
+  `Math.ceil()` 

------
#### [ Array ]

Metode array berikut didukung:
+ `Array.prototype.length` 
+ `Array.prototype.concat()` 
+ `Array.prototype.fill()` 
+ `Array.prototype.flat()` 
+ `Array.prototype.indexOf()` 
+ `Array.prototype.join()` 
+ `Array.prototype.lastIndexOf()` 
+ `Array.prototype.pop()` 
+ `Array.prototype.push()` 
+ `Array.prototype.reverse()` 
+ `Array.prototype.shift()` 
+ `Array.prototype.slice()` 
+ `Array.prototype.sort()`
**catatan**  
`Array.prototype.sort()`tidak mendukung argumen.
+ `Array.prototype.splice()` 
+ `Array.prototype.unshift()`
+ `Array.prototype.forEach()`
+ `Array.prototype.map()`
+ `Array.prototype.flatMap()`
+ `Array.prototype.filter()`
+ `Array.prototype.reduce()`
+ `Array.prototype.reduceRight()`
+ `Array.prototype.find()`
+ `Array.prototype.some()`
+ `Array.prototype.every()`
+ `Array.prototype.findIndex()`
+ `Array.prototype.findLast()`
+ `Array.prototype.findLastIndex()`
+ `delete` 

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

Objek konsol tersedia untuk debugging. Selama eksekusi kueri langsung, log/error pernyataan konsol dikirim ke Amazon CloudWatch Logs (jika logging diaktifkan). Selama evaluasi kode dengan`evaluateCode`, pernyataan log dikembalikan dalam respons perintah.
+ `console.error()`
+ `console.log()`

------
#### [ Function ]
+ `call`Metode `apply``bind`,, dan tidak didukung.
+ Tidak mendukung konstruktor fungsi.
+ Melewati fungsi sebagai argumen tidak didukung.
+ Panggilan fungsi rekursif tidak didukung.

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

Metode JSON berikut didukung:
+ `JSON.parse()`
**catatan**  
Mengembalikan string kosong jika string diurai tidak valid JSON.
+ `JSON.stringify()`

------
#### [ Promises ]

Proses asinkron tidak didukung, dan janji tidak didukung.

**catatan**  
Akses jaringan dan sistem file tidak didukung dalam `APPSYNC_JS` runtime di AWS AppSync. AWS AppSync menangani semua operasi I/O berdasarkan permintaan yang dibuat oleh AWS AppSync resolver atau fungsi. AWS AppSync 

------

## Global
<a name="globals"></a>

Mendukung konstanta global berikut:
+  `NaN` 
+  `Infinity` 
+  `undefined`
+ [https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html)
+ [https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html)
+ `runtime`

## Jenis kesalahan
<a name="error-types"></a>

Melempar kesalahan dengan `throw` tidak didukung. Anda dapat mengembalikan kesalahan dengan menggunakan `util.error()` fungsi. Anda dapat menyertakan kesalahan dalam respons GraphQL Anda dengan menggunakan fungsi tersebut. `util.appendError`

Untuk informasi selengkapnya, lihat [Kesalahan utils.](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html#utility-helpers-in-error-js)

# Utilitas bawaan
<a name="built-in-util-js"></a>

`util`Variabel berisi metode utilitas umum untuk membantu Anda bekerja dengan data. Kecuali ditentukan lain, semua utilitas menggunakan set karakter UTF-8.

## Pengkodean utilitas
<a name="utility-helpers-in-encoding"></a>

### Pengkodean daftar utilitas
<a name="utility-helpers-in-encoding-list-js"></a>

 **`util.urlEncode(String)`**  
Mengembalikan string masukan sebagai string `application/x-www-form-urlencoded` dikodekan.

 **`util.urlDecode(String)`**  
Mendekode string yang `application/x-www-form-urlencoded` dikodekan kembali ke bentuk yang tidak dikodekan.

**`util.base64Encode(string) : string`**  
Mengkodekan input ke dalam string yang dikodekan base64.

**`util.base64Decode(string) : string`**  
Mendekode data dari string yang dikodekan base64.

## Utilitas pembuatan ID
<a name="utility-helpers-in-id-gen-js"></a>

### Daftar utilitas pembuatan ID
<a name="utility-helpers-in-id-gen-list-js"></a>

 **`util.autoId()`**  
Mengembalikan UUID 128-bit yang dihasilkan secara acak.

**`util.autoUlid()`**  
Mengembalikan ULID 128-bit yang dihasilkan secara acak (Universalally Unique Lexicographically Sortable Identifier).

**`util.autoKsuid()`**  
Mengembalikan 128-bit yang dihasilkan secara acak KSUID (K-Sortable Unique Identifier) base62 dikodekan sebagai String dengan panjang 27.

## Kesalahan utils
<a name="utility-helpers-in-error-js"></a>

### Daftar utilitas kesalahan
<a name="utility-helpers-in-error-list-js"></a>

 **`util.error(String, String?, Object?, Object?)`**  
Melempar kesalahan khusus. Ini dapat digunakan dalam template pemetaan permintaan atau respons jika template mendeteksi kesalahan dengan permintaan atau dengan hasil pemanggilan. Selain itu, `errorType` bidang, `data` bidang, dan `errorInfo` bidang dapat ditentukan. `data`Nilai akan ditambahkan ke `error` blok yang sesuai di `errors` dalam respons GraphQL.  
`data`akan disaring berdasarkan set pemilihan kueri. `errorInfo`Nilai akan ditambahkan ke `error` blok yang sesuai di `errors` dalam respons GraphQL.  
`errorInfo`**tidak** akan disaring berdasarkan set pemilihan kueri.

 **`util.appendError(String, String?, Object?, Object?)`**  
Menambahkan kesalahan kustom. Ini dapat digunakan dalam template pemetaan permintaan atau respons jika template mendeteksi kesalahan dengan permintaan atau dengan hasil pemanggilan. Selain itu, `errorType` bidang, `data` bidang, dan `errorInfo` bidang dapat ditentukan. Tidak seperti`util.error(String, String?, Object?, Object?)`, evaluasi template tidak akan terganggu, sehingga data dapat dikembalikan ke penelepon. `data`Nilai akan ditambahkan ke `error` blok yang sesuai di `errors` dalam respons GraphQL.  
`data`akan disaring berdasarkan set pemilihan kueri. `errorInfo`Nilai akan ditambahkan ke `error` blok yang sesuai di `errors` dalam respons GraphQL.  
`errorInfo`**tidak** akan disaring berdasarkan set pemilihan kueri.

## Utils pencocokan jenis dan pola
<a name="utility-helpers-in-patterns-js"></a>

### Jenis dan pola pencocokan daftar utilitas
<a name="utility-helpers-in-patterns-js-list"></a>

**`util.matches(String, String) : Boolean`**  
Mengembalikan nilai true jika pola tertentu dalam argumen pertama cocok dengan data yang disediakan dalam argumen kedua. Pola harus berupa ekspresi reguler seperti`util.matches("a*b", "aaaaab")`. Fungsionalitas ini didasarkan pada [Pola](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html), yang dapat Anda referensi untuk dokumentasi lebih lanjut.

 **`util.authType()`**   
Mengembalikan String yang menjelaskan jenis multi-auth yang digunakan oleh permintaan, mengembalikan “IAM Authorization”, “User Pool Authorization”, “Open ID Connect Authorization”, atau “API Key Authorization”.

## Kembalikan utilitas perilaku nilai
<a name="utility-helpers-in-cloudwatch-logs-list-js"></a>

### Kembalikan daftar utilitas perilaku nilai
<a name="utility-helpers-in-behavior-list-js"></a>

 **`util.escapeJavaScript(String)`**  
Mengembalikan string masukan sebagai string JavaScript lolos.

## Utils otorisasi penyelesai
<a name="utility-helpers-in-resolver-auth-js"></a>

### Daftar utilitas otorisasi penyelesai
<a name="utility-helpers-in-resolver-auth-list-js"></a>

 **`util.unauthorized()`**  
Melempar `Unauthorized` untuk bidang yang sedang diselesaikan. Gunakan ini dalam templat pemetaan permintaan atau respons untuk menentukan apakah akan mengizinkan pemanggil menyelesaikan bidang.

# Modul bawaan
<a name="built-in-modules-js"></a>

Modul adalah bagian dari `APPSYNC_JS` runtime dan menyediakan utilitas untuk membantu menulis JavaScript resolver dan fungsi. Untuk sampel dan contoh, lihat [aws-appsync-resolver-samples](https://github.com/aws-samples/aws-appsync-resolver-samples) GitHub repositori.

## Fungsi modul DynamoDB
<a name="built-in-ddb-modules"></a>

Fungsi modul DynamoDB memberikan pengalaman yang ditingkatkan saat berinteraksi dengan sumber data DynamoDB. Anda dapat membuat permintaan terhadap sumber data DynamoDB Anda menggunakan fungsi dan tanpa menambahkan pemetaan tipe. 

Modul diimpor menggunakan`@aws-appsync/utils/dynamodb`:

```
// Modules are imported using @aws-appsync/utils/dynamodb
import * as ddb from '@aws-appsync/utils/dynamodb';
```

### Fungsi
<a name="built-in-ddb-modules-functions"></a>

#### Daftar fungsi
<a name="built-in-ddb-modules-functions-list"></a>

 **` get<T>(payload: GetInput): DynamoDBGetItemRequest`**  
Lihat [Masukan](#built-in-ddb-modules-inputs) untuk informasi tentang GetInput.
Menghasilkan `DynamoDBGetItemRequest` objek untuk membuat [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-getitem)permintaan ke DynamoDB.  

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

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

 **`put<T>(payload): DynamoDBPutItemRequest`**  
Menghasilkan `DynamoDBPutItemRequest` objek untuk membuat [PutItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem)permintaan ke DynamoDB.  

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

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

**`remove<T>(payload): DynamoDBDeleteItemRequest`**  
Menghasilkan `DynamoDBDeleteItemRequest` objek untuk membuat [DeleteItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-deleteitem)permintaan ke DynamoDB.  

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

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

**`scan<T>(payload): DynamoDBScanRequest`**  
Menghasilkan permintaan `DynamoDBScanRequest` untuk membuat [Scan](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan) ke DynamoDB.  

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

export function request(ctx) {
	const { limit = 10, nextToken } = ctx.args;
	return ddb.scan({ limit, nextToken });
}
```

**`sync<T>(payload): DynamoDBSyncRequest`**  
Menghasilkan `DynamoDBSyncRequest` objek untuk membuat permintaan [Sync](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-sync). Permintaan hanya menerima data yang diubah sejak kueri terakhir (pembaruan delta). Permintaan hanya dapat dibuat ke sumber data DynamoDB berversi.  

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

export function request(ctx) {
	const { limit = 10, nextToken, lastSync } = ctx.args;
	return ddb.sync({ limit, nextToken, lastSync });
}
```

**`update<T>(payload): DynamoDBUpdateItemRequest`**  
Menghasilkan `DynamoDBUpdateItemRequest` objek untuk membuat [UpdateItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-updateitem)permintaan ke DynamoDB.

### Operasi
<a name="built-in-ddb-modules-operations"></a>

Pembantu operasi memungkinkan Anda untuk mengambil tindakan spesifik pada bagian data Anda selama pembaruan. Untuk memulai, impor `operations` dari`@aws-appsync/utils/dynamodb`:

```
// Modules are imported using operations
import {operations} from '@aws-appsync/utils/dynamodb';
```

#### Daftar operasi
<a name="built-in-ddb-modules-operations-list"></a>

 **`add<T>(payload)`**  
Fungsi pembantu yang menambahkan item atribut baru saat memperbarui DynamoDB.  
**Contoh**  
Untuk menambahkan alamat (jalan, kota, dan kode pos) ke item DynamoDB yang ada menggunakan nilai ID:  

```
import { update, operations } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const updateObj = {
		address: operations.add({
			street1: '123 Main St',
			city: 'New York',
			zip: '10001',
		}),
	};
	return update({ key: { id: 1 }, update: updateObj });
}
```

**`append <T>(payload)`**  
Fungsi pembantu yang menambahkan payload ke daftar yang ada di DynamoDB.  
**Contoh**  
Untuk menambahkan friend IDs (`newFriendIds`) yang baru ditambahkan ke daftar teman yang ada (`friendsIds`) selama pembaruan:  

```
import { update, operations } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const newFriendIds = [101, 104, 111];
	const updateObj = {
		friendsIds: operations.append(newFriendIds),
	};
	return update({ key: { id: 1 }, update: updateObj });
}
```

**`decrement (by?)`**  
Fungsi pembantu yang mengurangi nilai atribut yang ada di item saat memperbarui DynamoDB.  
**Contoh**  
Untuk mengurangi counter teman (`friendsCount`) sebesar 10:  

```
import { update, operations } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const updateObj = {
		friendsCount: operations.decrement(10),
	};
	return update({ key: { id: 1 }, update: updateObj });
}
```

**`increment (by?)`**  
Fungsi pembantu yang menambah nilai atribut yang ada di item saat memperbarui DynamoDB.  
**Contoh**  
Untuk menambah counter teman (`friendsCount`) sebesar 10:  

```
import { update, operations } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const updateObj = {
		friendsCount: operations.increment(10),
	};
	return update({ key: { id: 1 }, update: updateObj });
}
```

**`prepend <T>(payload)`**  
Fungsi pembantu yang ditambahkan ke daftar yang ada di DynamoDB.  
**Contoh**  
Untuk menambahkan friend IDs (`newFriendIds`) yang baru ditambahkan ke daftar teman yang ada (`friendsIds`) selama pembaruan:  

```
import { update, operations } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const newFriendIds = [101, 104, 111];
	const updateObj = {
		friendsIds: operations.prepend(newFriendIds),
	};
	return update({ key: { id: 1 }, update: updateObj });
}
```

**`replace <T>(payload)`**  
Fungsi pembantu yang menggantikan atribut yang ada saat memperbarui item di DynamoDB. Ini berguna ketika Anda ingin memperbarui seluruh objek atau subobject di atribut dan bukan hanya kunci di payload.  
**Contoh**  
Untuk mengganti alamat (jalan, kota, dan kode pos) dalam suatu `info` objek:  

```
import { update, operations } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const updateObj = {
		info: {
			address: operations.replace({
				street1: '123 Main St',
				city: 'New York',
				zip: '10001',
			}),
		},
	};
	return update({ key: { id: 1 }, update: updateObj });
}
```

**`updateListItem <T>(payload, index)`**  
Fungsi pembantu yang menggantikan item dalam daftar.  
**Contoh**  
Dalam lingkup update (`newFriendIds`), contoh ini digunakan `updateListItem` untuk memperbarui nilai ID dari item kedua (index:`1`, new ID:`102`) dan item ketiga (index:`2`, new ID:`112`) dalam list (`friendsIds`).  

```
import { update, operations as ops } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
	const newFriendIds = [
		ops.updateListItem('102', 1), ops.updateListItem('112', 2)
	];
	const updateObj = { friendsIds: newFriendIds };
	return update({ key: { id: 1 }, update: updateObj });
}
```

### Masukan
<a name="built-in-ddb-modules-inputs"></a>

#### Daftar masukan
<a name="built-in-ddb-modules-inputs-list"></a>

 **`Type GetInput<T>`**  

```
GetInput<T>: { 
    consistentRead?: boolean; 
    key: DynamoDBKey<T>; 
}
```
**Jenis Deklarasi**  
+ `consistentRead?: boolean` (opsional)

  Boolean opsional untuk menentukan apakah Anda ingin melakukan pembacaan yang sangat konsisten dengan DynamoDB.
+ `key: DynamoDBKey<T>`(Diperlukan)

  Parameter yang diperlukan yang menentukan kunci item di DynamoDB. Item DynamoDB mungkin memiliki kunci hash tunggal atau kunci hash dan sortir.

**`Type PutInput<T>`**  

```
PutInput<T>: { 
    _version?: number; 
    condition?: DynamoDBFilterObject<T> | null; 
    customPartitionKey?: string; 
    item: Partial<T>; 
    key: DynamoDBKey<T>; 
    populateIndexFields?: boolean; 
}
```
**Jenis Deklarasi**  
+ `_version?: number` (opsional)
+ `condition?: DynamoDBFilterObject<T> | null` (opsional)

  Ketika Anda meletakkan objek dalam tabel DynamoDB, Anda dapat secara opsional menentukan ekspresi kondisional yang mengontrol apakah permintaan harus berhasil atau tidak berdasarkan status objek yang sudah ada di DynamoDB sebelum operasi dilakukan.
+ `customPartitionKey?: string` (opsional)

  Saat diaktifkan, nilai string ini memodifikasi format `ds_sk` dan `ds_pk` catatan yang digunakan oleh tabel sinkronisasi delta saat pembuatan versi telah diaktifkan. Saat diaktifkan, pemrosesan `populateIndexFields` entri juga diaktifkan. 
+ `item: Partial<T>`(Diperlukan)

  Sisa atribut item yang akan ditempatkan ke DynamoDB.
+ `key: DynamoDBKey<T>`(Diperlukan)

  Parameter yang diperlukan yang menentukan kunci item di DynamoDB di mana put akan dilakukan. Item DynamoDB mungkin memiliki kunci hash tunggal atau kunci hash dan sortir.
+ `populateIndexFields?: boolean` (opsional)

  Nilai boolean yang, ketika diaktifkan bersama dengan`customPartitionKey`, membuat entri baru untuk setiap catatan dalam tabel sinkronisasi delta, khususnya di kolom dan`gsi_ds_pk`. `gsi_ds_sk` Untuk informasi selengkapnya, lihat [Deteksi dan sinkronisasi konflik](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di *Panduan AWS AppSync Pengembang*.

**`Type QueryInput<T>`**  

```
QueryInput<T>: ScanInput<T> & { 
    query: DynamoDBKeyCondition<Required<T>>; 
}
```
**Jenis Deklarasi**  
+ `query: DynamoDBKeyCondition<Required<T>>`(Diperlukan)

  Menentukan kondisi kunci yang menjelaskan item untuk query. Untuk indeks tertentu, kondisi untuk kunci partisi harus berupa persamaan dan kunci pengurutan perbandingan atau a `beginsWith` (ketika itu adalah string). Hanya tipe angka dan string yang didukung untuk kunci partisi dan sortir.

  **Contoh**

  Ambil `User` tipe di bawah ini:

  ```
  type User = {
    id: string;
    name: string;
    age: number;
    isVerified: boolean;
    friendsIds: string[] 
  }
  ```

  Kueri hanya dapat menyertakan bidang-bidang berikut:`id`,`name`, dan`age`:

  ```
  const query: QueryInput<User> = {
      name: { eq: 'John' },
      age: { gt: 20 },
  }
  ```

**`Type RemoveInput<T>`**  

```
RemoveInput<T>: { 
    _version?: number; 
    condition?: DynamoDBFilterObject<T>; 
    customPartitionKey?: string; 
    key: DynamoDBKey<T>; 
    populateIndexFields?: boolean; 
}
```
**Jenis Deklarasi**  
+ `_version?: number` (opsional)
+ `condition?: DynamoDBFilterObject<T>` (opsional)

  Saat Anda menghapus objek di DynamoDB, Anda dapat secara opsional menentukan ekspresi bersyarat yang mengontrol apakah permintaan harus berhasil atau tidak berdasarkan status objek yang sudah ada di DynamoDB sebelum operasi dilakukan.

  **Contoh**

  Contoh berikut adalah `DeleteItem` ekspresi yang berisi kondisi yang memungkinkan operasi berhasil hanya jika pemilik dokumen cocok dengan pengguna yang membuat permintaan.

  ```
  type Task = {
    id: string;
    title: string;
    description: string;
    owner: string;
    isComplete: boolean;
  }
  const condition: DynamoDBFilterObject<Task> = {
    owner: { eq: 'XXXXXXXXXXXXXXXX' },
  }
  
  remove<Task>({
     key: {
       id: 'XXXXXXXXXXXXXXXX',
    },
    condition,
  });
  ```
+ `customPartitionKey?: string` (opsional)

  Saat diaktifkan, `customPartitionKey` nilai mengubah format `ds_sk` dan `ds_pk` catatan yang digunakan oleh tabel sinkronisasi delta saat pembuatan versi telah diaktifkan. Saat diaktifkan, pemrosesan `populateIndexFields` entri juga diaktifkan. 
+ `key: DynamoDBKey<T>`(Diperlukan)

  Parameter yang diperlukan yang menentukan kunci item di DynamoDB yang sedang dihapus. Item DynamoDB mungkin memiliki kunci hash tunggal atau kunci hash dan sortir.

  **Contoh**

  Jika `User` hanya memiliki kunci hash dengan pengguna`id`, maka kuncinya akan terlihat seperti ini:

  ```
  type User = {
  	id: number
  	name: string
  	age: number
  	isVerified: boolean
  }
  const key: DynamoDBKey<User> = {
  	id: 1,
  }
  ```

  Jika pengguna tabel memiliki kunci hash (`id`) dan sort key (`name`), maka kuncinya akan terlihat seperti ini:

  ```
  type User = {
  	id: number
  	name: string
  	age: number
  	isVerified: boolean
  	friendsIds: string[]
  }
  
  const key: DynamoDBKey<User> = {
  	id: 1,
  	name: 'XXXXXXXXXX',
  }
  ```
+ `populateIndexFields?: boolean` (opsional)

  Nilai boolean yang, ketika diaktifkan bersama dengan`customPartitionKey`, membuat entri baru untuk setiap catatan dalam tabel sinkronisasi delta, khususnya di kolom dan`gsi_ds_pk`. `gsi_ds_sk`

**`Type ScanInput<T>`**  

```
ScanInput<T>: { 
    consistentRead?: boolean | null; 
    filter?: DynamoDBFilterObject<T> | null; 
    index?: string | null; 
    limit?: number | null; 
    nextToken?: string | null; 
    scanIndexForward?: boolean | null; 
    segment?: number; 
    select?: DynamoDBSelectAttributes; 
    totalSegments?: number; 
}
```
**Jenis Deklarasi**  
+ `consistentRead?: boolean | null` (opsional)

  Boolean opsional untuk menunjukkan pembacaan yang konsisten saat menanyakan DynamoDB. Nilai default-nya adalah `false`.
+ `filter?: DynamoDBFilterObject<T> | null` (opsional)

  Filter opsional untuk diterapkan pada hasil setelah mengambilnya dari tabel.
+ `index?: string | null` (opsional)

  Nama opsional indeks untuk memindai.
+ `limit?: number | null` (opsional)

  Jumlah maksimal hasil opsional untuk dikembalikan.
+ `nextToken?: string | null` (opsional)

  Token pagination opsional untuk melanjutkan kueri sebelumnya. Ini akan diperoleh dari kueri sebelumnya.
+ `scanIndexForward?: boolean | null` (opsional)

  Boolean opsional untuk menunjukkan apakah kueri dilakukan dalam urutan naik atau turun. Secara default, nilai ini diatur ke `true`.
+ `segment?: number` (opsional)
+ `select?: DynamoDBSelectAttributes` (opsional)

  Atribut untuk kembali dari DynamoDB. Secara default, AWS AppSync DynamoDB resolver hanya mengembalikan atribut yang diproyeksikan ke dalam indeks. Nilai yang didukung adalah:
  + `ALL_ATTRIBUTES`

    Mengembalikan semua atribut item dari tabel tertentu atau indeks. Jika Anda menanyakan indeks sekunder lokal, DynamoDB mengambil seluruh item dari tabel induk untuk setiap item yang cocok dalam indeks. Jika indeks dikonfigurasi untuk memproyeksikan semua atribut item, semua data dapat diperoleh dari indeks sekunder lokal dan tidak diperlukan pengambilan.
  + `ALL_PROJECTED_ATTRIBUTES`

    Mengembalikan semua atribut yang telah diproyeksikan ke dalam indeks. Jika indeks dikonfigurasi untuk memproyeksikan semua atribut, nilai pengembalian ini setara dengan menentukan`ALL_ATTRIBUTES`.
  + `SPECIFIC_ATTRIBUTES`

    Mengembalikan hanya atribut yang tercantum dalam`ProjectionExpression`. Nilai pengembalian ini setara dengan menentukan `ProjectionExpression` tanpa menentukan nilai apa pun untuk. `AttributesToGet`
+ `totalSegments?: number` (opsional)

**`Type DynamoDBSyncInput<T>`**  

```
DynamoDBSyncInput<T>: { 
    basePartitionKey?: string; 
    deltaIndexName?: string; 
    filter?: DynamoDBFilterObject<T> | null; 
    lastSync?: number; 
    limit?: number | null; 
    nextToken?: string | null; 
}
```
**Jenis Deklarasi**  
+ `basePartitionKey?: string` (opsional)

  Kunci partisi dari tabel dasar yang akan digunakan saat melakukan operasi Sync. Bidang ini memungkinkan operasi Sync dilakukan ketika tabel menggunakan kunci partisi kustom.
+ `deltaIndexName?: string` (opsional)

  Indeks yang digunakan untuk operasi Sync. Indeks ini diperlukan untuk mengaktifkan operasi Sinkronisasi di seluruh tabel penyimpanan delta saat tabel menggunakan kunci partisi khusus. Operasi Sinkronisasi akan dilakukan pada GSI (dibuat pada `gsi_ds_pk` dan`gsi_ds_sk`).
+ `filter?: DynamoDBFilterObject<T> | null` (opsional)

  Filter opsional untuk diterapkan pada hasil setelah mengambilnya dari tabel.
+ `lastSync?: number` (opsional)

  Saat itu, dalam milidetik epoch, di mana operasi Sync sukses terakhir dimulai. Jika ditentukan, hanya item yang telah berubah setelah `lastSync` dikembalikan. Bidang ini seharusnya hanya diisi setelah mengambil semua halaman dari operasi Sinkronisasi awal. Jika dihilangkan, hasil dari tabel dasar akan dikembalikan. Jika tidak, hasil dari tabel delta akan dikembalikan.
+ `limit?: number | null` (opsional)

  Jumlah maksimum opsional item untuk dievaluasi pada satu waktu. Jika dihilangkan, batas default akan diatur ke `100` item. Nilai maksimum untuk bidang ini adalah `1000` item.
+ `nextToken?: string | null` (opsional)

**`Type DynamoDBUpdateInput<T>`**  

```
DynamoDBUpdateInput<T>: { 
    _version?: number; 
    condition?: DynamoDBFilterObject<T>; 
    customPartitionKey?: string; 
    key: DynamoDBKey<T>; 
    populateIndexFields?: boolean; 
    update: DynamoDBUpdateObject<T>; 
}
```
**Jenis Deklarasi**  
+ `_version?: number` (opsional)
+ `condition?: DynamoDBFilterObject<T>` (opsional)

  Saat Anda memperbarui objek di DynamoDB, Anda dapat secara opsional menentukan ekspresi bersyarat yang mengontrol apakah permintaan harus berhasil atau tidak berdasarkan status objek yang sudah ada di DynamoDB sebelum operasi dilakukan.
+ `customPartitionKey?: string` (opsional)

  Saat diaktifkan, `customPartitionKey` nilai mengubah format `ds_sk` dan `ds_pk` catatan yang digunakan oleh tabel sinkronisasi delta saat pembuatan versi telah diaktifkan. Saat diaktifkan, pemrosesan `populateIndexFields` entri juga diaktifkan. 
+ `key: DynamoDBKey<T>`(Diperlukan)

  Parameter yang diperlukan yang menentukan kunci item di DynamoDB yang sedang diperbarui. Item DynamoDB mungkin memiliki kunci hash tunggal atau kunci hash dan sortir.
+ `populateIndexFields?: boolean` (opsional)

  Nilai boolean yang, ketika diaktifkan bersama dengan`customPartitionKey`, membuat entri baru untuk setiap catatan dalam tabel sinkronisasi delta, khususnya di kolom dan`gsi_ds_pk`. `gsi_ds_sk` 
+ `update: DynamoDBUpdateObject<T>`

  Objek yang menentukan atribut yang akan diperbarui bersama dengan nilai-nilai baru untuk mereka. Objek pembaruan dapat digunakan dengan`add`,`remove`,`replace`,`increment`,`decrement`,`append`,`prepend`,`updateListItem`.

## Fungsi modul Amazon RDS
<a name="built-in-rds-modules"></a>

Fungsi modul Amazon RDS memberikan pengalaman yang disempurnakan saat berinteraksi dengan database yang dikonfigurasi dengan Amazon RDS Data API. Modul diimpor menggunakan`@aws-appsync/utils/rds`: 

```
import * as rds from '@aws-appsync/utils/rds';
```

Fungsi juga dapat diimpor secara individual. Misalnya, impor di bawah ini menggunakan`sql`:

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

### Fungsi
<a name="built-in-rds-modules-functions"></a>

Anda dapat menggunakan pembantu utilitas modul AWS AppSync RDS untuk berinteraksi dengan database Anda.

#### Pilih
<a name="built-in-rds-modules-functions-select"></a>

`select`Utilitas membuat `SELECT` pernyataan untuk query database relasional Anda. 

**Penggunaan dasar**

Dalam bentuk dasarnya, Anda dapat menentukan tabel yang ingin Anda kueri:

```
import { select, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {

    // Generates statement: 
    // "SELECT * FROM "persons"
    return createPgStatement(select({table: 'persons'}));
}
```

Perhatikan bahwa Anda juga dapat menentukan skema dalam pengidentifikasi tabel Anda:

```
import { select, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {

    // Generates statement:
    // SELECT * FROM "private"."persons"
    return createPgStatement(select({table: 'private.persons'}));
}
```

**Menentukan kolom**

Anda dapat menentukan kolom dengan `columns` properti. Jika ini tidak disetel ke nilai, defaultnya adalah: `*`

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name']
    }));
}
```

Anda dapat menentukan tabel kolom juga:

```
export function request(ctx) {

    // Generates statement: 
    // SELECT "id", "persons"."name"
    // FROM "persons"
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'persons.name']
    }));
}
```

**Batas dan offset**

Anda dapat menerapkan `limit` dan `offset` ke kueri:

```
export function request(ctx) {

    // Generates statement: 
    // SELECT "id", "name"
    // FROM "persons"
    // LIMIT :limit
    // OFFSET :offset
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        limit: 10,
        offset: 40
    }));
}
```

**Memesan oleh**

Anda dapat mengurutkan hasil Anda dengan `orderBy` properti. Menyediakan array objek yang menentukan kolom dan `dir` properti opsional:

```
export function request(ctx) {

    // Generates statement: 
    // SELECT "id", "name" FROM "persons"
    // ORDER BY "name", "id" DESC
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        orderBy: [{column: 'name'}, {column: 'id', dir: 'DESC'}]
    }));
}
```

**Filter**

Anda dapat membangun filter dengan menggunakan objek kondisi khusus:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE "name" = :NAME
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: {name: {eq: 'Stephane'}}
    }));
}
```

Anda juga dapat menggabungkan filter:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE "name" = :NAME and "id" > :ID
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: {name: {eq: 'Stephane'}, id: {gt: 10}}
    }));
}
```

Anda juga dapat membuat `OR` pernyataan:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE "name" = :NAME OR "id" > :ID
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: { or: [
            { name: { eq: 'Stephane'} },
            { id: { gt: 10 } }
        ]}
    }));
}
```

Anda juga dapat meniadakan suatu kondisi dengan`not`:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE NOT ("name" = :NAME AND "id" > :ID)
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: { not: [
            { name: { eq: 'Stephane'} },
            { id: { gt: 10 } }
        ]}
    }));
}
```

Anda juga dapat menggunakan operator berikut untuk membandingkan nilai:


| 
| 
| Operator | Deskripsi | Jenis nilai yang mungkin | 
| --- |--- |--- |
| persamaan | Sama | nomor, string, boolean | 
| ne | Tidak sama | nomor, string, boolean | 
| le | Kurang dari atau sama | nomor, string | 
| lt | Kurang dari | nomor, string | 
| ge | Lebih besar dari atau sama | nomor, string | 
| gt | Lebih besar dari | nomor, string | 
| mengandung | Suka | string | 
| NotBerisi | Tidak suka | string | 
| Mulailah dengan | Dimulai dengan awalan | string | 
| antara | Antara dua nilai | nomor, string | 
| AttributeExists | Atribut tidak null | nomor, string, boolean | 
| ukuran | memeriksa panjang elemen | string | 

#### Sisipkan
<a name="built-in-rds-modules-functions-insert"></a>

`insert`Utilitas menyediakan cara mudah untuk memasukkan item baris tunggal dalam database Anda dengan operasi. `INSERT`

**Penyisipan item tunggal**

Untuk menyisipkan item, tentukan tabel dan kemudian masukkan objek nilai Anda. Kunci objek dipetakan ke kolom tabel Anda. Nama kolom secara otomatis lolos, dan nilai dikirim ke database menggunakan peta variabel:

```
import { insert, createMySQLStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: values } = ctx.args;
    const insertStatement = insert({ table: 'persons', values });
    
    // Generates statement:
    // INSERT INTO `persons`(`name`)
    // VALUES(:NAME)
    return createMySQLStatement(insertStatement)
}
```

**Kasus penggunaan MySQL**

Anda dapat menggabungkan `insert` diikuti oleh a `select` untuk mengambil baris yang disisipkan:

```
import { insert, select, createMySQLStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: values } = ctx.args;
    const insertStatement = insert({  table: 'persons', values });
    const selectStatement = select({
        table: 'persons',
        columns: '*',
        where: { id: { eq: values.id } },
        limit: 1,
    });
    
    // Generates statement:
    // INSERT INTO `persons`(`name`)
    // VALUES(:NAME)
    // and
    // SELECT *
    // FROM `persons`
    // WHERE `id` = :ID
    return createMySQLStatement(insertStatement, selectStatement)
}
```

**Kasus penggunaan postgres**

Dengan Postgres, Anda dapat menggunakan [https://www.postgresql.org/docs/current/dml-returning.html](https://www.postgresql.org/docs/current/dml-returning.html)untuk mendapatkan data dari baris yang Anda masukkan. Ia menerima `*` atau array nama kolom:

```
import { insert, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: values } = ctx.args;
    const insertStatement = insert({
        table: 'persons',
        values,
        returning: '*'
    });

    // Generates statement:
    // INSERT INTO "persons"("name")
    // VALUES(:NAME)
    // RETURNING *
    return createPgStatement(insertStatement)
}
```

#### Perbarui
<a name="built-in-rds-modules-functions-update"></a>

`update`Utilitas memungkinkan Anda untuk memperbarui baris yang ada. Anda dapat menggunakan objek kondisi untuk menerapkan perubahan pada kolom yang ditentukan di semua baris yang memenuhi kondisi. Sebagai contoh, katakanlah kita memiliki skema yang memungkinkan kita membuat mutasi ini. Kami ingin memperbarui `name` of `Person` dengan `id` nilai `3` tetapi hanya jika kami mengetahuinya (`known_since`) sejak tahun ini`2000`:

```
mutation Update {
    updatePerson(
        input: {id: 3, name: "Jon"},
        condition: {known_since: {ge: "2000"}}
    ) {
    id
    name
  }
}
```

Penyelesai pembaruan kami terlihat seperti ini:

```
import { update, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: { id, ...values }, condition } = ctx.args;
    const where = {
        ...condition,
        id: { eq: id },
    };
    const updateStatement = update({
        table: 'persons',
        values,
        where,
        returning: ['id', 'name'],
    });

    // Generates statement:
    // UPDATE "persons"
    // SET "name" = :NAME, "birthday" = :BDAY, "country" = :COUNTRY
    // WHERE "id" = :ID
    // RETURNING "id", "name"
    return createPgStatement(updateStatement)
}
```

Kita dapat menambahkan cek ke kondisi kita untuk memastikan bahwa hanya baris yang memiliki kunci utama `id` sama dengan `3` yang diperbarui. Demikian pula, untuk Postgres`inserts`, Anda dapat menggunakan `returning` untuk mengembalikan data yang dimodifikasi. 

#### Menghapus
<a name="built-in-rds-modules-functions-remove"></a>

`remove`Utilitas memungkinkan Anda untuk menghapus baris yang ada. Anda dapat menggunakan objek kondisi pada semua baris yang memenuhi kondisi. Perhatikan bahwa itu `delete` adalah kata kunci yang dicadangkan di JavaScript. `remove`harus digunakan sebagai gantinya:

```
import { remove, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: { id }, condition } = ctx.args;
    const where = { ...condition, id: { eq: id } };
    const deleteStatement = remove({
        table: 'persons',
        where,
        returning: ['id', 'name'],
    });

    // Generates statement:
    // DELETE "persons"
    // WHERE "id" = :ID
    // RETURNING "id", "name"
    return createPgStatement(updateStatement)
}
```

### Casting
<a name="built-in-rds-modules-casting"></a>

Dalam beberapa kasus, Anda mungkin ingin lebih spesifisitas tentang jenis objek yang benar untuk digunakan dalam pernyataan Anda. Anda dapat menggunakan petunjuk jenis yang disediakan untuk menentukan jenis parameter Anda. AWS AppSync mendukung [petunjuk jenis yang sama](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html#rdsdtataservice-Type-SqlParameter-typeHint) dengan Data API. Anda dapat mentransmisikan parameter Anda dengan menggunakan `typeHint` fungsi dari AWS AppSync `rds` modul. 

Contoh berikut memungkinkan Anda untuk mengirim array sebagai nilai yang dicor sebagai objek JSON. Kami menggunakan `->` operator untuk mengambil elemen di `index` `2` dalam array JSON:

```
import { sql, createPgStatement, toJsonObject, typeHint } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const arr = ctx.args.list_of_ids
    const statement = sql`select ${typeHint.JSON(arr)}->2 as value`
    return createPgStatement(statement)
}

export function response(ctx) {
    return toJsonObject(ctx.result)[0][0].value
}
```

Casting juga berguna saat menangani dan membandingkan`DATE`,`TIME`, dan`TIMESTAMP`:

```
import { select, createPgStatement, typeHint } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const when = ctx.args.when
    const statement = select({
        table: 'persons',
        where: { createdAt : { gt: typeHint.DATETIME(when) } }
    })
    return createPgStatement(statement)
}
```

Berikut contoh lain yang menunjukkan bagaimana Anda dapat mengirim tanggal dan waktu saat ini:

```
import { sql, createPgStatement, typeHint } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const now = util.time.nowFormatted('YYYY-MM-dd HH:mm:ss')
    return createPgStatement(sql`select ${typeHint.TIMESTAMP(now)}`)
}
```

**Petunjuk tipe yang tersedia**
+ `typeHint.DATE`- Parameter yang sesuai dikirim sebagai objek `DATE` tipe ke database. Format yang diterima adalah `YYYY-MM-DD`.
+ `typeHint.DECIMAL`- Parameter yang sesuai dikirim sebagai objek `DECIMAL` tipe ke database.
+ `typeHint.JSON`- Parameter yang sesuai dikirim sebagai objek `JSON` tipe ke database.
+ `typeHint.TIME`- Nilai parameter string yang sesuai dikirim sebagai objek dari `TIME` tipe ke database. Format yang diterima adalah `HH:MM:SS[.FFF]`. 
+ `typeHint.TIMESTAMP`- Nilai parameter string yang sesuai dikirim sebagai objek dari `TIMESTAMP` tipe ke database. Format yang diterima adalah `YYYY-MM-DD HH:MM:SS[.FFF]`.
+ `typeHint.UUID`- Nilai parameter string yang sesuai dikirim sebagai objek dari `UUID` tipe ke database.

# Utilitas runtime
<a name="runtime-utils-js"></a>

`runtime`Pustaka menyediakan utilitas untuk mengontrol atau memodifikasi properti runtime dari resolver dan fungsi Anda.

## Daftar utilitas runtime
<a name="runtime-utils-list-js"></a>

 **`runtime.earlyReturn(obj?: unknown, returnOptions?: {skipTo: 'END' | 'NEXT'}): never`**  
Memanggil fungsi ini akan menghentikan eksekusi handler saat ini, AWS AppSync fungsi atau resolver (Unit atau Pipeline Resolver) tergantung pada konteks saat ini. Objek yang ditentukan dikembalikan sebagai hasilnya.  
+ Saat dipanggil dalam penangan permintaan AWS AppSync fungsi, sumber data dan penangan respons dilewati, dan penangan permintaan fungsi berikutnya (atau pengendali respons penyelesai pipa jika ini adalah fungsi terakhir) dipanggil. AWS AppSync 
+ Ketika dipanggil dalam penangan permintaan penyelesai AWS AppSync pipa, eksekusi pipeline dilewati, dan pengendali respons penyelesai pipa segera dipanggil.
+ Ketika `returnOptions` diberikan dengan `skipTo` disetel ke “END”, eksekusi pipeline dilewati, dan pengendali respons penyelesai pipa segera dipanggil.
+ Ketika `returnOptions` diberikan dengan `skipTo` set ke “NEXT”, eksekusi fungsi dilewati, dan pengendali pipeline berikutnya dipanggil.
**Contoh**  

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

export function request(ctx) {
  runtime.earlyReturn({ hello: 'world' })
  // code below is not executed
  return ctx.args
}

// never called because request returned early
export function response(ctx) {
  return ctx.result
}
```

# Pembantu waktu di util.time
<a name="time-helpers-in-util-time-js"></a>

`util.time`Variabel berisi metode datetime untuk membantu menghasilkan stempel waktu, mengonversi antara format datetime, dan mengurai string datetime. Sintaks untuk format datetime didasarkan pada [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)mana Anda dapat referensi untuk dokumentasi lebih lanjut.

## Daftar utilitas waktu
<a name="utility-helpers-in-time-list-js"></a>

 **`util.time.nowISO8601()`**  
Mengembalikan representasi String dari UTC dalam [ISO8601format](https://en.wikipedia.org/wiki/ISO_8601).

 **`util.time.nowEpochSeconds()`**  
Mengembalikan jumlah detik dari epoch 1970-01-01T 00:00:00 Z ke sekarang.

 **`util.time.nowEpochMilliSeconds()`**  
Mengembalikan jumlah milidetik dari epoch 1970-01-01T 00:00:00 Z ke sekarang.

 **`util.time.nowFormatted(String)`**  
Mengembalikan string timestamp saat ini di UTC menggunakan format yang ditentukan dari tipe input String.

 **`util.time.nowFormatted(String, String)`**  
Mengembalikan string timestamp saat ini untuk zona waktu menggunakan format yang ditentukan dan zona waktu dari jenis input String.

 **`util.time.parseFormattedToEpochMilliSeconds(String, String)`**  
Mem-parsing stempel waktu yang diteruskan sebagai String bersama dengan format yang berisi zona waktu, lalu mengembalikan stempel waktu sebagai milidetik sejak epoch.

 **`util.time.parseFormattedToEpochMilliSeconds(String, String, String)`**  
Mem-parsing stempel waktu yang diteruskan sebagai String bersama dengan format dan zona waktu, lalu mengembalikan stempel waktu sebagai milidetik sejak epoch.

 **`util.time.parseISO8601ToEpochMilliSeconds(String)`**  
Mem-parsing ISO8601 stempel waktu yang diteruskan sebagai String, lalu mengembalikan stempel waktu sebagai milidetik sejak epoch.

 **`util.time.epochMilliSecondsToSeconds(long)`**  
Mengonversi stempel waktu milidetik epoch menjadi stempel waktu epoch detik.

 **`util.time.epochMilliSecondsToISO8601(long)`**  
Mengonversi stempel waktu milidetik epoch menjadi stempel waktu. ISO8601

 **`util.time.epochMilliSecondsToFormatted(long, String)`**  
Mengonversi stempel waktu milidetik epoch, diteruskan selama, ke stempel waktu yang diformat sesuai dengan format yang disediakan di UTC.

 **`util.time.epochMilliSecondsToFormatted(long, String, String)`**  
Mengonversi stempel waktu milidetik epoch, diteruskan sebagai panjang, ke stempel waktu yang diformat sesuai dengan format yang disediakan di zona waktu yang disediakan.

# Pembantu DynamoDB di util.dynamodb
<a name="dynamodb-helpers-in-util-dynamodb-js"></a>

`util.dynamodb`berisi metode pembantu yang memudahkan untuk menulis dan membaca data ke Amazon DynamoDB, seperti pemetaan dan pemformatan tipe otomatis. 

## ToDynamoDB
<a name="utility-helpers-in-toDynamoDB-js"></a>

### Daftar utilitas ToDynamoDB
<a name="utility-helpers-in-toDynamoDB-list-js"></a>

 **`util.dynamodb.toDynamoDB(Object)`**   
Alat konversi objek umum untuk DynamoDB yang mengubah objek masukan ke representasi DynamoDB yang sesuai. Ini berpendirian tentang bagaimana itu mewakili beberapa jenis: misalnya, itu akan menggunakan daftar (“L”) daripada set (“SS”, “NS”, “BS”). Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  
**Contoh string**  

```
Input:      util.dynamodb.toDynamoDB("foo")
Output:     { "S" : "foo" }
```
**Contoh angka**  

```
Input:      util.dynamodb.toDynamoDB(12345)
Output:     { "N" : 12345 }
```
**Contoh Boolean**  

```
Input:      util.dynamodb.toDynamoDB(true)
Output:     { "BOOL" : true }
```
**Daftar contoh**  

```
Input:      util.dynamodb.toDynamoDB([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```
**Contoh peta**  

```
Input:      util.dynamodb.toDynamoDB({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "M" : {
                   "foo"  : { "S" : "bar" },
                   "baz"  : { "N" : 1234 },
                   "beep" : {
                       "L" : [
                           { "S" : "boop" }
                       ]
                   }
               }
           }
```

## ToString utilitas
<a name="utility-helpers-in-toString-js"></a>

### Daftar utilitas ToString
<a name="utility-helpers-in-toString-list-js"></a>

**`util.dynamodb.toString(String)`**  
Mengkonversi string input ke format string DynamoDB. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toString("foo")
Output:     { "S" : "foo" }
```

 **`util.dynamodb.toStringSet(List<String>)`**  
Mengkonversi daftar dengan Strings ke format set string DynamoDB. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toStringSet([ "foo", "bar", "baz" ])
Output:     { "SS" : [ "foo", "bar", "baz" ] }
```

## utilitas Tonumber
<a name="utility-helpers-in-toNumber-js"></a>

### Daftar utilitas Tonumber
<a name="utility-helpers-in-toNumber-list-js"></a>

 **`util.dynamodb.toNumber(Number)`**  
Mengkonversi angka ke format nomor DynamoDB. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toNumber(12345)
Output:     { "N" : 12345 }
```

 **`util.dynamodb.toNumberSet(List<Number>)`**  
Mengkonversi daftar angka ke format set nomor DynamoDB. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toNumberSet([ 1, 23, 4.56 ])
Output:     { "NS" : [ 1, 23, 4.56 ] }
```

## Kegunaan toBinary
<a name="utility-helpers-in-toBinary-js"></a>

### Daftar utilitas toBinary
<a name="utility-helpers-in-toBinary-list-js"></a>

 **`util.dynamodb.toBinary(String)`**  
Mengkonversi data biner dikodekan sebagai string base64 ke format biner DynamoDB. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toBinary("foo")
Output:     { "B" : "foo" }
```

 **`util.dynamodb.toBinarySet(List<String>)`**  
Mengkonversi daftar data biner yang dikodekan sebagai string base64 ke format set biner DynamoDB. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toBinarySet([ "foo", "bar", "baz" ])
Output:     { "BS" : [ "foo", "bar", "baz" ] }
```

## utilitas ToBoolean
<a name="utility-helpers-in-toBoolean-js"></a>

### Daftar utilitas ToBoolean
<a name="utility-helpers-in-toBoolean-list-js"></a>

 **`util.dynamodb.toBoolean(Boolean)`**  
Mengkonversi Boolean ke format DynamoDB Boolean yang sesuai. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toBoolean(true)
Output:     { "BOOL" : true }
```

## utilitas ToNull
<a name="utility-helpers-in-toNull-js"></a>

### Daftar utilitas ToNull
<a name="utility-helpers-in-toNull-list-js"></a>

 **`util.dynamodb.toNull()`**  
Mengembalikan null dalam format DynamoDB null. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toNull()
Output:     { "NULL" : null }
```

## utilitas ToList
<a name="utility-helpers-in-toList-js"></a>

### Daftar utilitas ToList
<a name="utility-helpers-in-toList-list-js"></a>

**`util.dynamodb.toList(List)`**  
Mengkonversi daftar objek ke format daftar DynamoDB. Setiap item dalam daftar juga dikonversi ke format DynamoDB yang sesuai. Ini berpendapat tentang bagaimana itu mewakili beberapa objek bersarang: misalnya, itu akan menggunakan daftar (“L”) daripada set (“SS”, “NS”, “BS”). Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toList([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```

## TomAp utilitas
<a name="utility-helpers-in-toMap-js"></a>

### Daftar utilitas TomAP
<a name="utility-helpers-in-toMap-list-js"></a>

 **`util.dynamodb.toMap(Map)`**  
Mengkonversi peta ke format peta DynamoDB. Setiap nilai dalam peta juga dikonversi ke format DynamoDB yang sesuai. Ini berpendapat tentang bagaimana itu mewakili beberapa objek bersarang: misalnya, itu akan menggunakan daftar (“L”) daripada set (“SS”, “NS”, “BS”). Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toMap({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "M" : {
                   "foo"  : { "S" : "bar" },
                   "baz"  : { "N" : 1234 },
                   "beep" : {
                       "L" : [
                           { "S" : "boop" }
                       ]
                   }
               }
           }
```

 **`util.dynamodb.toMapValues(Map)`**  
Membuat salinan peta di mana setiap nilai telah dikonversi ke format DynamoDB yang sesuai. Ini berpendapat tentang bagaimana itu mewakili beberapa objek bersarang: misalnya, itu akan menggunakan daftar (“L”) daripada set (“SS”, “NS”, “BS”).  

```
Input:      util.dynamodb.toMapValues({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "foo"  : { "S" : "bar" },
               "baz"  : { "N" : 1234 },
               "beep" : {
                   "L" : [
                       { "S" : "boop" }
                   ]
               }
           }
```
Ini sedikit berbeda `util.dynamodb.toMap(Map)` karena hanya mengembalikan isi dari nilai atribut DynamoDB, tetapi tidak seluruh nilai atribut itu sendiri. Misalnya, pernyataan berikut persis sama:  

```
util.dynamodb.toMapValues(<map>)
util.dynamodb.toMap(<map>)("M")
```

## S3Object utilitas
<a name="utility-helpers-in-S3Object-js"></a>

### Daftar utilitas S3Object
<a name="utility-helpers-in-S3Object-list-js"></a>

**`util.dynamodb.toS3Object(String key, String bucket, String region)`**  
Mengonversi kunci, bucket, dan wilayah menjadi representasi DynamoDB S3 Object. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toS3Object("foo", "bar", region = "baz")
Output:     { "S" : "{ \"s3\" : { \"key\" : \"foo", \"bucket\" : \"bar", \"region\" : \"baz" } }" }
```

**`util.dynamodb.toS3Object(String key, String bucket, String region, String version)`**  
Mengonversi kunci, bucket, region, dan versi opsional menjadi representasi DynamoDB S3 Object. Ini mengembalikan sebuah objek yang menggambarkan nilai atribut DynamoDB.  

```
Input:      util.dynamodb.toS3Object("foo", "bar", "baz", "beep")
Output:     { "S" : "{ \"s3\" : { \"key\" : \"foo\", \"bucket\" : \"bar\", \"region\" : \"baz\", \"version\" = \"beep\" } }" }
```

 **`util.dynamodb.fromS3ObjectJson(String)`**  
Menerima nilai string Objek DynamoDB S3 dan mengembalikan peta yang berisi kunci, bucket, wilayah, dan versi opsional.  

```
Input:      util.dynamodb.fromS3ObjectJson({ "S" : "{ \"s3\" : { \"key\" : \"foo\", \"bucket\" : \"bar\", \"region\" : \"baz\", \"version\" = \"beep\" } }" })
Output:     { "key" : "foo", "bucket" : "bar", "region" : "baz", "version" : "beep" }
```

# Pembantu HTTP di util.http
<a name="http-helpers-in-utils-http-js"></a>

`util.http`Utilitas menyediakan metode pembantu yang dapat Anda gunakan untuk mengelola parameter permintaan HTTP dan untuk menambahkan header respons.

## daftar util.http utils
<a name="http-helpers-in-utils-http-list-js"></a>

 **`util.http.copyHeaders(headers)`**  
Menyalin header dari peta, tidak termasuk header HTTP terbatas berikut:  
+ transfer-encoding
+ connection
+ host
+ expect
+ keep-alive
+ upgrade
+ proxy-authenticate
+ proxy-authorization
+ te
+ content-length

**`util.http.addResponseHeader(String, Object)`**  
Menambahkan header kustom tunggal dengan nama (`String`) dan nilai (`Object`) dari respon. Batasan berikut berlaku:  
+ Selain daftar header terbatas untuk`copyHeaders(headers)`, nama header tidak dapat cocok dengan salah satu dari berikut ini:
  + Access-Control-Allow-Credentials
  + Access-Control-Allow-Origin
  + Access-Control-Expose-Headers
  + Access-Control-Max-Age
  + Access-Control-Allow-Methods
  + Access-Control-Allow-Headers
  + Vary
  + Content-Type
+ Nama header tidak dapat dimulai dengan awalan `x-amzn-` terbatas atau. `x-amz-`
+ Ukuran header respons kustom tidak boleh melebihi 4 KB. Ini termasuk nama dan nilai header.
+ Anda harus menentukan setiap header respons sekali per operasi GraphQL. Namun, jika Anda menentukan header kustom dengan nama yang sama beberapa kali, definisi terbaru akan muncul dalam respons. Semua header dihitung terhadap batas ukuran header terlepas dari penamaan.
+ Header dengan nama kosong atau terbatas `(String)` atau nilai null `(Object)` akan diabaikan dan menghasilkan `ResponseHeaderError` kesalahan yang ditambahkan ke output operasi. `errors`

```
export function request(ctx) {
  util.http.addResponseHeader('itemsCount', 7)
  util.http.addResponseHeader('render', ctx.args.render)
  return {}
}
```

**`util.http.addResponseHeaders(Map)`**  
Menambahkan beberapa header respons ke respons dari peta nama `(String)` dan nilai `(Object)` yang ditentukan. Keterbatasan yang sama yang tercantum untuk `addResponseHeader(String, Object)` metode ini juga berlaku untuk metode ini.  

```
export function request(ctx) {
  const headers = {
    headerInt: 12,
    headerString: 'stringValue',
    headerObject: {
      field1: 7,
      field2: 'string'
    }
  }
  util.http.addResponseHeaders(headers)
  return {}
}
```

# Pembantu transformasi di util.transform
<a name="transformation-helpers-in-utils-transform-js"></a>

`util.transform`berisi metode pembantu yang membuatnya lebih mudah untuk melakukan operasi kompleks terhadap sumber data.

## Daftar utilitas pembantu transformasi
<a name="transformation-helpers-in-utils-transform-js-list"></a>

**`util.transform.toDynamoDBFilterExpression(filterObject: DynamoDBFilterObject) : string`**  
Mengkonversi string input ke ekspresi filter untuk digunakan dengan DynamoDB. Kami merekomendasikan penggunaan `toDynamoDBFilterExpression` dengan [fungsi modul bawaan](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-modules-js.html).

**`util.transform.toElasticsearchQueryDSL(object: OpenSearchQueryObject) : string`**  
Mengkonversi input yang diberikan ke ekspresi OpenSearch Query DSL yang setara, mengembalikannya sebagai string JSON.  
**Contoh masukan:**  

```
util.transform.toElasticsearchQueryDSL({
    "upvotes":{
        "ne":15,
        "range":[
            10,
            20
        ]
    },
    "title":{
        "eq":"hihihi",
        "wildcard":"h*i"
    }
  })
```
**Contoh keluaran:**  

```
{
    "bool":{
      "must":[
          {
            "bool":{
              "must":[
                  {
                    "bool":{
                      "must_not":{
                        "term":{
                          "upvotes":15
                        }
                      }
                    }
                  },
                  {
                    "range":{
                      "upvotes":{
                        "gte":10,
                        "lte":20
                      }
                    }
                  }
              ]
            }
          },
          {
            "bool":{
              "must":[
                  {
                    "term":{
                      "title":"hihihi"
                    }
                  },
                  {
                  "wildcard":{
                      "title":"h*i"
                    }
                  }
              ]
            }
          }
      ]
    }
}
```
Operator default diasumsikan AND.

**`util.transform.toSubscriptionFilter(objFilter, ignoredFields?, rules?): SubscriptionFilter`**  
Mengkonversi objek `Map` input ke objek `SubscriptionFilter` ekspresi. `util.transform.toSubscriptionFilter`Metode ini digunakan sebagai masukan ke `extensions.setSubscriptionFilter()` ekstensi. Untuk informasi selengkapnya, lihat [Ekstensi](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html).  
Parameter dan pernyataan pengembalian tercantum di bawah ini:  
*Parameter*  
+ `objFilter`: `SubscriptionFilterObject`

  Objek `Map` masukan yang dikonversi ke objek `SubscriptionFilter` ekspresi.
+ `ignoredFields`: `SubscriptionFilterExcludeKeysType` (opsional)

  Sebuah `List` nama bidang di objek pertama yang akan diabaikan.
+ `rules`: `SubscriptionFilterRuleObject` (opsional)

  Objek `Map` masukan dengan aturan ketat yang disertakan saat Anda membangun objek `SubscriptionFilter` ekspresi. Aturan ketat ini akan dimasukkan dalam objek `SubscriptionFilter` ekspresi sehingga setidaknya salah satu aturan akan dipenuhi untuk melewati filter berlangganan.
*Respons*  
Mengembalikan `[SubscriptionFilter](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html)`.

**`util.transform.toSubscriptionFilter(Map, List)`**  
Mengkonversi objek `Map` input ke objek `SubscriptionFilter` ekspresi. `util.transform.toSubscriptionFilter`Metode ini digunakan sebagai masukan ke `extensions.setSubscriptionFilter()` ekstensi. Untuk informasi selengkapnya, lihat [Ekstensi](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html).  
Argumen pertama adalah objek `Map` masukan yang dikonversi ke objek `SubscriptionFilter` ekspresi. Argumen kedua adalah nama `List` bidang yang diabaikan dalam objek `Map` masukan pertama saat membangun objek `SubscriptionFilter` ekspresi.

**`util.transform.toSubscriptionFilter(Map, List, Map)`**  
Mengkonversi objek `Map` input ke objek `SubscriptionFilter` ekspresi. `util.transform.toSubscriptionFilter`Metode ini digunakan sebagai masukan ke `extensions.setSubscriptionFilter()` ekstensi. Untuk informasi selengkapnya, lihat [Ekstensi](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html). 

**`util.transform.toDynamoDBConditionExpression(conditionObject)`**  
Menciptakan ekspresi kondisi DynamoDB.

## Argumen filter langganan
<a name="subscription-filter-arguments-js"></a>

Tabel berikut menjelaskan bagaimana argumen utilitas berikut didefinisikan:
+ `Util.transform.toSubscriptionFilter(objFilter, ignoredFields?, rules?): SubscriptionFilter`

------
#### [ Argument 1: Map ]

Argumen 1 adalah `Map` objek dengan nilai-nilai kunci berikut:
+ nama bidang
+ “dan”
+ “atau”

Untuk nama bidang sebagai kunci, kondisi pada entri bidang ini adalah dalam bentuk. `"operator" : "value"` 

Contoh berikut menunjukkan bagaimana entri dapat ditambahkan ke`Map`:

```
"field_name" : {
                    "operator1" : value             
               }

## We can have multiple conditions for the same field_name: 

"field_name" : {
                    "operator1" : value             
                    "operator2" : value
                    .
                    .
                    .                  
               }
```

Ketika sebuah bidang memiliki dua atau lebih kondisi di atasnya, semua kondisi ini dianggap menggunakan operasi OR.

Input juga `Map` dapat memiliki “dan” dan “atau” sebagai kunci, menyiratkan bahwa semua entri di dalamnya harus digabungkan menggunakan logika AND atau OR tergantung pada kuncinya. Nilai kunci “dan” dan “atau” mengharapkan berbagai kondisi.

```
"and" : [
            
            {
                "field_name1" : {
                    "operator1" : value             
                }
             },
             
             {
                "field_name2" : {
                    "operator1" : value             
                }
             },
             .
             .
        ].
```

Perhatikan bahwa Anda dapat bersarang “dan” dan “atau”. Artinya, Anda dapat memiliki sarang “dan” /"atau” di dalam blok “dan” /"atau” lainnya. Namun, ini tidak berfungsi untuk bidang sederhana.

```
"and" : [
            
            {
                "field_name1" : {
                    "operator" : value             
                }
             },
             
             {
                "or" : [
                            {
                                "field_name2" : {
                                    "operator" : value             
                                }
                            },
                            
                            {
                                "field_name3" : {
                                    "operator" : value             
                                }
                            }
              
                        ].
```

Contoh berikut menunjukkan masukan *argumen 1* menggunakan`util.transform.toSubscriptionFilter(Map) : Map`.

**Masukan**

Argumen 1: Peta:

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "gt": 2000
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

**Keluaran**

Hasilnya adalah `Map` objek:

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "lte",
          "value": 50
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Admin"
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "lte",
          "value": 50
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "gte",
          "value": 20
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Admin"
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "percentageUp",
          "operator": "gte",
          "value": 20
        },
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 2000
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    }
  ]
}
```

------
#### [ Argument 2: List ]

Argumen 2 berisi nama `List` bidang yang tidak boleh dipertimbangkan dalam input `Map` (argumen 1) saat membangun objek `SubscriptionFilter` ekspresi. `List`Bisa juga kosong.

Contoh berikut menunjukkan masukan argumen 1 dan argumen 2 menggunakan`util.transform.toSubscriptionFilter(Map, List) : Map`.

**Masukan**

Argumen 1: Peta:

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "gt": 20
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

Argumen 2: Daftar:

```
["percentageUp", "author"]
```

**Keluaran**

Hasilnya adalah `Map` objek:

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        }
      ]
    }
  ]
}
```

------
#### [ Argument 3: Map ]

Argumen 3 adalah `Map` objek yang memiliki nama bidang sebagai nilai kunci (tidak dapat memiliki “dan” atau “atau”). Untuk nama bidang sebagai kunci, kondisi pada bidang ini adalah entri dalam bentuk. `"operator" : "value"` Tidak seperti argumen 1, argumen 3 tidak dapat memiliki beberapa kondisi dalam kunci yang sama. Selain itu, argumen 3 tidak memiliki klausa “dan” atau “atau”, jadi tidak ada sarang yang terlibat juga.

Argumen 3 merupakan daftar aturan ketat, yang ditambahkan ke objek `SubscriptionFilter` ekspresi sehingga **setidaknya satu** dari kondisi ini terpenuhi untuk melewati filter.

```
{
  "fieldname1": {
    "operator": value
  },
  "fieldname2": {
    "operator": value
  }
}
.
.
.
```

Contoh berikut menunjukkan masukan dari *argumen 1*, *argumen 2*, dan *argumen 3* menggunakan`util.transform.toSubscriptionFilter(Map, List, Map) : Map`.

**Masukan**

Argumen 1: Peta:

```
{
  "percentageUp": {
    "lte": 50,
    "gte": 20
  },
  "and": [
    {
      "title": {
        "ne": "Book1"
      }
    },
    {
      "downvotes": {
        "lt": 20
      }
    }
  ],
  "or": [
    {
      "author": {
        "eq": "Admin"
      }
    },
    {
      "isPublished": {
        "eq": false
      }
    }
  ]
}
```

Argumen 2: Daftar:

```
["percentageUp", "author"]
```

Argumen 3: Peta:

```
{
  "upvotes": {
    "gte": 250
  },
  "author": {
    "eq": "Person1"
  }
}
```

**Keluaran**

Hasilnya adalah `Map` objek:

```
{
  "filterGroup": [
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        },
        {
          "fieldName": "upvotes",
          "operator": "gte",
          "value": 250
        }
      ]
    },
    {
      "filters": [
        {
          "fieldName": "title",
          "operator": "ne",
          "value": "Book1"
        },
        {
          "fieldName": "downvotes",
          "operator": "gt",
          "value": 20
        },
        {
          "fieldName": "isPublished",
          "operator": "eq",
          "value": false
        },
        {
          "fieldName": "author",
          "operator": "eq",
          "value": "Person1"
        }
      ]
    }
  ]
}
```

------

# Pembantu string di util.str
<a name="str-helpers-in-util-str-js"></a>

 `util.str`berisi metode untuk membantu operasi String umum. 

## util.str daftar util.str
<a name="str-helpers-in-util-str-list-js"></a>

 **`util.str.normalize(String, String)`**  
Menormalkan string menggunakan salah satu dari empat bentuk normalisasi unicode: NFC, NFD, NFKC, atau NFKD. Argumen pertama adalah string untuk menormalkan. Argumen kedua adalah “nfc”, “nfd”, “nfkc”, atau “nfkd” yang menentukan jenis normalisasi yang akan digunakan untuk proses normalisasi.

# Ekstensi
<a name="extensions-js"></a>

`extensions`berisi serangkaian metode untuk membuat tindakan tambahan dalam resolver Anda.

## Ekstensi caching
<a name="caching-extensions-js-list"></a>

**`extensions.evictFromApiCache(typeName: string, fieldName: string, keyValuePair: Record<string, any>) : Object`**  
Mengusir item dari cache sisi AWS AppSync server. Argumen pertama adalah nama tipe. Argumen kedua adalah nama bidang. Argumen ketiga adalah objek yang berisi item pasangan kunci-nilai yang menentukan nilai kunci caching. Anda harus meletakkan item dalam objek dalam urutan yang sama dengan kunci caching di resolver cache. `cachingKey` Untuk informasi selengkapnya tentang caching, lihat [Perilaku cache](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html#caching-behavior).  
**Contoh 1:**  
Contoh ini mengusir item yang di-cache untuk resolver yang dipanggil `Query.allClasses` di mana kunci caching dipanggil digunakan. `context.arguments.semester` Ketika mutasi dipanggil dan resolver berjalan, jika entri berhasil dihapus, maka respons berisi `apiCacheEntriesDeleted` nilai dalam objek ekstensi yang menunjukkan berapa banyak entri yang dihapus.  

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

export const request = (ctx) => ({ payload: null });

export function response(ctx) {
	extensions.evictFromApiCache('Query', 'allClasses', {
		'context.arguments.semester': ctx.args.semester,
	});
	return null;
}
```
Fungsi ini **hanya** berfungsi untuk mutasi, bukan kueri.

## Ekstensi berlangganan
<a name="subscription-extensions-js-list"></a>

**`extensions.setSubscriptionFilter(filterJsonObject)`**  
Mendefinisikan filter langganan yang disempurnakan. Setiap acara pemberitahuan langganan dievaluasi terhadap filter langganan yang disediakan dan mengirimkan pemberitahuan kepada klien jika semua filter mengevaluasi. `true` Argumennya adalah `filterJsonObject` (Informasi lebih lanjut tentang argumen ini dapat ditemukan di bawah di filterJsonObject bagian *Argumen:*.). Lihat [Pemfilteran langganan yang disempurnakan](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html).  
Anda dapat menggunakan fungsi ekstensi ini hanya di handler respons dari resolver langganan. Juga, kami sarankan menggunakan `util.transform.toSubscriptionFilter` untuk membuat filter Anda.

**`extensions.setSubscriptionInvalidationFilter(filterJsonObject)`**  
Mendefinisikan filter pembatalan langganan. Filter langganan dievaluasi terhadap muatan pembatalan, lalu membatalkan langganan yang diberikan jika filter mengevaluasi. `true` Argumennya adalah `filterJsonObject` (Informasi lebih lanjut tentang argumen ini dapat ditemukan di bawah di filterJsonObject bagian *Argumen:*.). Lihat [Pemfilteran langganan yang disempurnakan](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html).  
Anda dapat menggunakan fungsi ekstensi ini hanya di handler respons dari resolver langganan. Juga, kami sarankan menggunakan `util.transform.toSubscriptionFilter` untuk membuat filter Anda.

**`extensions.invalidateSubscriptions(invalidationJsonObject)`**  
Digunakan untuk memulai pembatalan langganan dari mutasi. Argumennya adalah `invalidationJsonObject` (Informasi lebih lanjut tentang argumen ini dapat ditemukan di bawah di invalidationJsonObject bagian *Argumen:*.).  
Ekstensi ini hanya dapat digunakan dalam template pemetaan respons dari resolver mutasi.  
Anda hanya dapat menggunakan paling banyak lima panggilan `extensions.invalidateSubscriptions()` metode unik dalam satu permintaan. Jika Anda melebihi batas ini, Anda akan menerima kesalahan GraphQL.

## Argumen: filterJsonObject
<a name="extensions-filterJsonObject-js"></a>

Objek JSON mendefinisikan filter langganan atau pembatalan. Ini adalah array filter dalam a`filterGroup`. Setiap filter adalah kumpulan filter individual.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

Setiap filter memiliki tiga atribut: 
+ `fieldName`- Bidang skema GraphQL.
+ `operator`— Jenis operator.
+ `value`— Nilai untuk dibandingkan dengan `fieldName` nilai notifikasi langganan.

Berikut ini adalah contoh penugasan atribut ini:

```
{
 "fieldName" : "severity",
 "operator" : "le",
 "value" : context.result.severity
}
```

## Argumen: invalidationJsonObject
<a name="extensions-invalidationJsonObject-js"></a>

`invalidationJsonObject`Mendefinisikan sebagai berikut:
+ `subscriptionField`— Langganan skema GraphQL untuk membatalkan. Langganan tunggal, didefinisikan sebagai string di`subscriptionField`, dianggap untuk pembatalan.
+ `payload`— Daftar pasangan kunci-nilai yang digunakan sebagai input untuk membatalkan langganan jika filter pembatalan mengevaluasi terhadap nilainya. `true`

  Contoh berikut membatalkan klien yang berlangganan dan terhubung menggunakan `onUserDelete` langganan saat filter pembatalan yang ditentukan dalam resolver langganan mengevaluasi terhadap nilainya. `true` `payload`

  ```
  export const request = (ctx) => ({ payload: null });
  
  export function response(ctx) {
  	extensions.invalidateSubscriptions({
  		subscriptionField: 'onUserDelete',
  		payload: { group: 'Developer', type: 'Full-Time' },
  	});
  	return ctx.result;
  }
  ```

# Pembantu XMLdi util.xml
<a name="xml-helpers-in-util-xml-js"></a>

 `util.xml`berisi metode untuk membantu dengan konversi string XHTML. 

## daftar utilitas util.xml
<a name="xml-helpers-in-util-xml-list-js"></a>

 **`util.xml.toMap(String) : Object`**  
Mengkonversi string XHTML ke kamus.  
**Contoh 1:**  

```
Input:

<?xml version="1.0" encoding="UTF-8"?>
<posts>
<post>
    <id>1</id>
    <title>Getting started with GraphQL</title>
</post>
</posts>

Output (object):

{
    "posts":{
      "post":{
        "id":1,
        "title":"Getting started with GraphQL"
      }
    }
}
```
**Contoh 2:**  

```
Input:

<?xml version="1.0" encoding="UTF-8"?>
<posts>
<post>
  <id>1</id>
  <title>Getting started with GraphQL</title>
</post>
<post>
  <id>2</id>
  <title>Getting started with AppSync</title>
</post>
</posts>

Output (JavaScript object):

{
    "posts":{
    "post":[
        {
            "id":1,
            "title":"Getting started with GraphQL"
        },
        {
            "id":2,
            "title":"Getting started with AppSync"
        }
    ]
    }
}
```

**`util.xml.toJsonString(String, Boolean?) : String`**  
Mengkonversi string XHTML ke string JSON. Ini mirip dengan`toMap`, kecuali bahwa outputnya adalah string. Hal ini berguna jika Anda ingin langsung mengkonversi dan mengembalikan respon XMLdari objek HTTP ke JSON. Anda dapat mengatur parameter boolean opsional untuk menentukan apakah Anda ingin string-encode JSON.

# AWS AppSync JavaScript referensi fungsi resolver untuk DynamoDB
<a name="js-resolver-reference-dynamodb"></a>

Fungsi AWS AppSync DynamoDB memungkinkan Anda menggunakan [GraphQL](https://graphql.org) untuk menyimpan dan mengambil data dalam tabel Amazon DynamoDB yang ada di akun Anda dengan memetakan permintaan GraphQL yang masuk ke dalam panggilan DynamoDB, lalu memetakan respons DynamoDB kembali ke GraphQL. Bagian ini menjelaskan penangan permintaan dan respons untuk operasi DynamoDB yang didukung:
+  [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-getitem.html)- GetItem Permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat GetItem permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan kunci item di DynamoDB dan apakah akan menggunakan pembacaan yang konsisten atau tidak.
+  [ PutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-putitem.html)- Dokumen pemetaan PutItem permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat PutItem permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan kunci item di DynamoDB, isi lengkap item (terdiri dari kunci dan attributeValues), dan kondisi agar operasi berhasil.
+  [ UpdateItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-updateitem.html)- UpdateItem Permintaan memungkinkan Anda untuk memberi tahu fungsi DynamoDB untuk membuat UpdateItem permintaan ke DynamoDB dan memungkinkan Anda untuk menentukan kunci item di DynamoDB, ekspresi pembaruan yang menjelaskan cara memperbarui item di DynamoDB, dan kondisi agar operasi berhasil.
+  [ DeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-deleteitem.html)- DeleteItem Permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat DeleteItem permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan kunci item di DynamoDB dan kondisi agar operasi berhasil.
+  [Query](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-query.html) - Objek permintaan Query memungkinkan Anda memberi tahu penyelesai DynamoDB untuk membuat permintaan Query ke DynamoDB, dan memungkinkan Anda menentukan ekspresi kunci, indeks mana yang akan digunakan, filter tambahan, berapa banyak item yang akan dikembalikan, apakah akan menggunakan pembacaan yang konsisten, arah kueri (maju atau mundur), dan token pagination.
+  [Scan](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-scan.html) - Permintaan Scan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat permintaan Scan ke DynamoDB, dan memungkinkan Anda menentukan filter untuk mengecualikan hasil, indeks mana yang akan digunakan, berapa banyak item yang akan dikembalikan, apakah akan menggunakan pembacaan yang konsisten, token pagination, dan scan paralel.
+  [Sync](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-sync.html) - Objek permintaan Sync memungkinkan Anda mengambil semua hasil dari tabel DynamoDB dan kemudian menerima hanya data yang diubah sejak kueri terakhir Anda (pembaruan delta). Permintaan sinkronisasi hanya dapat dilakukan ke sumber data DynamoDB berversi. Anda dapat menentukan filter untuk mengecualikan hasil, berapa banyak item yang akan dikembalikan, Token pagination, dan kapan operasi Sinkronisasi terakhir Anda dimulai.
+  [ BatchGetItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-get-item.html)- Objek BatchGetItem permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat BatchGetItem permintaan ke DynamoDB untuk mengambil beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan nama tabel untuk mengambil item dari dan kunci item yang akan diambil dari setiap tabel.
+  [ BatchDeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-delete-item.html)- Objek BatchDeleteItem permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat BatchWriteItem permintaan ke DynamoDB untuk menghapus beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan nama tabel untuk menghapus item dari dan kunci item yang akan dihapus dari setiap tabel.
+  [ BatchPutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-put-item.html)- Objek BatchPutItem permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat BatchWriteItem permintaan ke DynamoDB untuk menempatkan beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan nama tabel untuk memasukkan item dan item lengkap untuk dimasukkan ke dalam setiap tabel.
+  [ TransactGetItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-get-items.html)- Objek TransactGetItems permintaan memungkinkan Anda untuk memberitahu fungsi DynamoDB untuk membuat TransactGetItems permintaan ke DynamoDB untuk mengambil beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan nama tabel dari setiap item permintaan untuk mengambil item dari dan kunci setiap item permintaan untuk diambil dari setiap tabel.
+  [ TransactWriteItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-write-items.html)- Objek TransactWriteItems permintaan memungkinkan Anda memberi tahu fungsi DynamoDB untuk membuat TransactWriteItems permintaan ke DynamoDB untuk menulis beberapa item, berpotensi ke beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan nama tabel tujuan dari setiap item permintaan, operasi setiap item permintaan yang akan dilakukan, dan kunci dari setiap item permintaan untuk ditulis.
+  [Sistem tipe (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-typed-values-request.html) - Pelajari lebih lanjut tentang bagaimana pengetikan DynamoDB diintegrasikan ke dalam permintaan. AWS AppSync 
+  [Sistem tipe (pemetaan respons)](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-typed-values-responses.html) - Pelajari lebih lanjut tentang cara jenis DynamoDB dikonversi secara otomatis ke GraphQL atau JSON dalam muatan respons.
+  [Filter](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-filter.html) - Pelajari lebih lanjut tentang filter untuk operasi kueri dan pemindaian.
+  [Ekspresi kondisi](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-condition-expressions.html) - Pelajari lebih lanjut tentang ekspresi kondisi untuk PutItem, UpdateItem, dan DeleteItem operasi.
+  [Ekspresi kondisi transaksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions.html) - Pelajari lebih lanjut tentang ekspresi kondisi untuk TransactWriteItems operasi.
+  [Proyeksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-projections.html) - Pelajari lebih lanjut tentang cara menentukan atribut dalam operasi baca.

# GetItem
<a name="js-aws-appsync-resolver-reference-dynamodb-getitem"></a>

`GetItem`Permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `GetItem` permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan:
+ Kunci item di DynamoDB
+ Apakah akan menggunakan bacaan yang konsisten atau tidak

`GetItem`Permintaan memiliki struktur sebagai berikut:

```
type DynamoDBGetItem = {
  operation: 'GetItem';
  key: { [key: string]: any };
  consistentRead?: ConsistentRead;
  projection?: {
    expression: string;
    expressionNames?: { [key: string]: string };
  };
};
```

Bidang didefinisikan sebagai berikut:

## GetItem bidang
<a name="js-getitem-list"></a>

### GetItem daftar bidang
<a name="js-getitem-list-col"></a>

 **`operation`**   
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `GetItem` DynamoDB, ini harus diatur ke. `GetItem` Nilai ini diperlukan.

 **`key`**   
Kunci item di DynamoDB. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.

 **`consistentRead`**   
Apakah akan melakukan pembacaan yang sangat konsisten dengan DynamoDB atau tidak. Ini opsional, dan defaultnya. `false`

**`projection`**  
Proyeksi yang digunakan untuk menentukan atribut yang akan dikembalikan dari operasi DynamoDB. Untuk informasi selengkapnya tentang proyeksi, lihat [Proyeksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Bidang ini bersifat opsional.

Item yang dikembalikan dari DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON, dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

## Contoh
<a name="js-example"></a>

Contoh berikut adalah handler permintaan fungsi untuk query GraphQL: `getThing(foo: String!, bar: String!)`

```
export function request(ctx) {
  const {foo, bar} = ctx.args
  return {
    operation : "GetItem",
    key : util.dynamodb.toMapValues({foo, bar}),
    consistentRead : true
  }
}
```

Untuk informasi selengkapnya tentang DynamoDB API, lihat `GetItem` dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API.

# PutItem
<a name="js-aws-appsync-resolver-reference-dynamodb-putitem"></a>

Dokumen pemetaan `PutItem` permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `PutItem` permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan hal berikut:
+ Kunci item di DynamoDB
+ Isi lengkap item (terdiri dari `key` dan`attributeValues`)
+ Kondisi agar operasi berhasil

`PutItem`Permintaan memiliki struktur sebagai berikut:

```
type DynamoDBPutItemRequest = {
  operation: 'PutItem';
  key: { [key: string]: any };
  attributeValues: { [key: string]: any};
  condition?: ConditionCheckExpression;
  customPartitionKey?: string;
  populateIndexFields?: boolean;
  _version?: number;
};
```

Bidang didefinisikan sebagai berikut:

## PutItem bidang
<a name="js-putitem-list"></a>

### PutItem daftar bidang
<a name="js-putitem-list-col"></a>

 **`operation`**   
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `PutItem` DynamoDB, ini harus diatur ke. `PutItem` Nilai ini diperlukan.

 **`key`**   
Kunci item di DynamoDB. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.

 **`attributeValues`**   
Sisa atribut item yang akan dimasukkan ke DynamoDB. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Bidang ini bersifat opsional.

 **`condition`**   
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Jika tidak ada kondisi yang ditentukan, `PutItem` permintaan akan menimpa entri yang ada untuk item tersebut. Untuk informasi selengkapnya tentang kondisi, lihat [Ekspresi kondisi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Nilai ini bersifat opsional.

 **`_version`**   
Nilai numerik yang mewakili versi item terbaru yang diketahui. Nilai ini bersifat opsional. Bidang ini digunakan untuk *Deteksi Konflik* dan hanya didukung pada sumber data berversi.

**`customPartitionKey`**  
*Saat diaktifkan, nilai string ini mengubah format `ds_sk` dan `ds_pk` catatan yang digunakan oleh tabel sinkronisasi delta saat pembuatan versi telah diaktifkan (untuk informasi selengkapnya, lihat [Deteksi konflik dan sinkronisasi](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di Panduan Pengembang AWS AppSync ).* Saat diaktifkan, pemrosesan `populateIndexFields` entri juga diaktifkan. Bidang ini bersifat opsional.

**`populateIndexFields`**  
Nilai boolean yang, ketika diaktifkan **bersama dengan `customPartitionKey`**, membuat entri baru untuk setiap catatan dalam tabel sinkronisasi delta, khususnya di kolom dan`gsi_ds_pk`. `gsi_ds_sk` Untuk informasi selengkapnya, lihat [Deteksi dan sinkronisasi konflik](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di *Panduan AWS AppSync Pengembang*. Bidang ini bersifat opsional.   
Item yang ditulis ke DynamoDB secara otomatis dikonversi ke tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Item yang ditulis ke DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

## Contoh 1
<a name="js-example-1"></a>

Contoh berikut adalah penangan permintaan fungsi untuk mutasi GraphQL. `updateThing(foo: String!, bar: String!, name: String!, version: Int!)`

Jika tidak ada item dengan kunci yang ditentukan, itu dibuat. Jika item sudah ada dengan kunci yang ditentukan, itu akan ditimpa.

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

## Contoh 2
<a name="js-example-2"></a>

Contoh berikut adalah penangan permintaan fungsi untuk mutasi GraphQL. `updateThing(foo: String!, bar: String!, name: String!, expectedVersion: Int!)`

Contoh ini memverifikasi bahwa item saat ini di DynamoDB memiliki `version` bidang yang disetel ke. `expectedVersion`

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  const { foo, bar, name, expectedVersion } = ctx.args;
  const values = { name, version: expectedVersion + 1 };
  let condition = util.transform.toDynamoDBConditionExpression({
    version: { eq: expectedVersion },
  });

  return {
    operation: 'PutItem',
    key: util.dynamodb.toMapValues({ foo, bar }),
    attributeValues: util.dynamodb.toMapValues(values),
    condition,
  };
}
```

Untuk informasi selengkapnya tentang DynamoDB API, lihat `PutItem` dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API.

# UpdateItem
<a name="js-aws-appsync-resolver-reference-dynamodb-updateitem"></a>

`UpdateItem`Permintaan memungkinkan Anda untuk memberitahu fungsi AWS AppSync DynamoDB untuk membuat `UpdateItem` permintaan ke DynamoDB dan memungkinkan Anda untuk menentukan yang berikut:
+ Kunci item di DynamoDB
+ Ekspresi pembaruan yang menjelaskan cara memperbarui item di DynamoDB
+ Kondisi agar operasi berhasil

`UpdateItem`Permintaan memiliki struktur sebagai berikut:

```
type DynamoDBUpdateItemRequest = {
  operation: 'UpdateItem';
  key: { [key: string]: any };
  update: {
    expression: string;
    expressionNames?: { [key: string]: string };
    expressionValues?: { [key: string]: any };
  };
  condition?: ConditionCheckExpression;
  customPartitionKey?: string;
  populateIndexFields?: boolean;
  _version?: number;
};
```

Bidang didefinisikan sebagai berikut:

## UpdateItem bidang
<a name="js-updateitem-list"></a>

### UpdateItem daftar bidang
<a name="js-updateitem-list-col"></a>

 **`operation`**   
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `UpdateItem` DynamoDB, ini harus diatur ke. `UpdateItem` Nilai ini diperlukan.

 **`key`**   
Kunci item di DynamoDB. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.

 **`update`**   
`update`Bagian ini memungkinkan Anda menentukan ekspresi pembaruan yang menjelaskan cara memperbarui item di DynamoDB. Untuk informasi selengkapnya tentang cara menulis ekspresi pembaruan, lihat dokumentasi [DynamoDB UpdateExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Bagian ini diperlukan.  
`update`Bagian ini memiliki tiga komponen:    
** `expression` **  
Ekspresi pembaruan. Nilai ini diperlukan.  
** `expressionNames` **  
Substitusi untuk placeholder *nama* atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nama yang digunakan dalam`expression`, dan nilainya harus berupa string yang sesuai dengan nama atribut item di DynamoDB. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam. `expression`  
** `expressionValues` **  
Substitusi untuk placeholder *nilai* atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nilai yang digunakan dalam`expression`, dan nilainya harus berupa nilai yang diketik. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Ini harus ditentukan. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nilai atribut ekspresi yang digunakan dalam. `expression`

 **`condition`**   
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Jika tidak ada kondisi yang ditentukan, `UpdateItem` permintaan akan memperbarui entri yang ada terlepas dari statusnya saat ini. Untuk informasi selengkapnya tentang kondisi, lihat [Ekspresi kondisi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Nilai ini bersifat opsional.

 **`_version`**   
Nilai numerik yang mewakili versi item terbaru yang diketahui. Nilai ini bersifat opsional. Bidang ini digunakan untuk *Deteksi Konflik* dan hanya didukung pada sumber data berversi.

**`customPartitionKey`**  
*Saat diaktifkan, nilai string ini mengubah format `ds_sk` dan `ds_pk` catatan yang digunakan oleh tabel sinkronisasi delta saat pembuatan versi telah diaktifkan (untuk informasi selengkapnya, lihat [Deteksi konflik dan sinkronisasi](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di Panduan Pengembang AWS AppSync ).* Saat diaktifkan, pemrosesan `populateIndexFields` entri juga diaktifkan. Bidang ini bersifat opsional.

**`populateIndexFields`**  
Nilai boolean yang, ketika diaktifkan **bersama dengan `customPartitionKey`**, membuat entri baru untuk setiap catatan dalam tabel sinkronisasi delta, khususnya di kolom dan`gsi_ds_pk`. `gsi_ds_sk` Untuk informasi selengkapnya, lihat [Deteksi dan sinkronisasi konflik](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di *Panduan AWS AppSync Pengembang*. Bidang ini bersifat opsional.

Item yang diperbarui di DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

## Contoh 1
<a name="js-id3"></a>

Contoh berikut adalah penangan permintaan fungsi untuk mutasi GraphQL. `upvote(id: ID!)`

Dalam contoh ini, item di DynamoDB memiliki `version` dan `upvotes` bidangnya bertambah 1.

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  const { id } = ctx.args;
  return {
    operation: 'UpdateItem',
    key: util.dynamodb.toMapValues({ id }),
    update: {
      expression: 'ADD #votefield :plusOne, version :plusOne',
      expressionNames: { '#votefield': 'upvotes' },
      expressionValues: { ':plusOne': { N: 1 } },
    },
  };
}
```

## Contoh 2
<a name="js-id4"></a>

Contoh berikut adalah penangan permintaan fungsi untuk mutasi GraphQL. `updateItem(id: ID!, title: String, author: String, expectedVersion: Int!)`

Ini adalah contoh kompleks yang memeriksa argumen dan secara dinamis menghasilkan ekspresi pembaruan yang hanya mencakup argumen yang telah disediakan oleh klien. Misalnya, jika `title` dan `author` dihilangkan, mereka tidak diperbarui. Jika argumen ditentukan tetapi nilainya`null`, maka bidang itu dihapus dari objek di DynamoDB. Akhirnya, operasi memiliki kondisi, yang memverifikasi apakah item saat ini di DynamoDB memiliki `version` bidang yang disetel ke: `expectedVersion`

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  const { args: { input: { id, ...values } } } = ctx;

  const condition = {
    id: { attributeExists: true },
    version: { eq: values.expectedVersion },
  };
  values.expectedVersion += 1;
  return dynamodbUpdateRequest({ keys: { id }, values, condition });
}


/**
 * Helper function to update an item
 * @returns an UpdateItem request
 */
function dynamodbUpdateRequest(params) {
  const { keys, values, condition: inCondObj } = params;

  const sets = [];
  const removes = [];
  const expressionNames = {};
  const expValues = {};

  // Iterate through the keys of the values
  for (const [key, value] of Object.entries(values)) {
    expressionNames[`#${key}`] = key;
    if (value) {
      sets.push(`#${key} = :${key}`);
      expValues[`:${key}`] = value;
    } else {
      removes.push(`#${key}`);
    }
  }

  let expression = sets.length ? `SET ${sets.join(', ')}` : '';
  expression += removes.length ? ` REMOVE ${removes.join(', ')}` : '';

  const condition = JSON.parse(
    util.transform.toDynamoDBConditionExpression(inCondObj)
  );

  return {
    operation: 'UpdateItem',
    key: util.dynamodb.toMapValues(keys),
    condition,
    update: {
      expression,
      expressionNames,
      expressionValues: util.dynamodb.toMapValues(expValues),
    },
  };
}
```

Untuk informasi selengkapnya tentang DynamoDB API, lihat `UpdateItem` dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) API.

# DeleteItem
<a name="js-aws-appsync-resolver-reference-dynamodb-deleteitem"></a>

`DeleteItem`Permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `DeleteItem` permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan yang berikut:
+ Kunci item di DynamoDB
+ Kondisi agar operasi berhasil

`DeleteItem`Permintaan memiliki struktur sebagai berikut:

```
type DynamoDBDeleteItemRequest = {
  operation: 'DeleteItem';
  key: { [key: string]: any };
  condition?: ConditionCheckExpression;
  customPartitionKey?: string;
  populateIndexFields?: boolean;
  _version?: number;
};
```

Bidang didefinisikan sebagai berikut:

## DeleteItem bidang
<a name="js-deleteitem-list"></a>

### DeleteItem daftar bidang
<a name="js-deleteitem-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `DeleteItem` DynamoDB, ini harus diatur ke. `DeleteItem` Nilai ini diperlukan.

** `key` **  
Kunci item di DynamoDB. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.

** `condition` **  
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Jika tidak ada kondisi yang ditentukan, `DeleteItem` permintaan menghapus item terlepas dari keadaan saat ini. Untuk informasi selengkapnya tentang kondisi, lihat [Ekspresi kondisi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Nilai ini bersifat opsional.

** `_version` **  
Nilai numerik yang mewakili versi item terbaru yang diketahui. Nilai ini bersifat opsional. Bidang ini digunakan untuk *Deteksi Konflik* dan hanya didukung pada sumber data berversi.

**`customPartitionKey`**  
*Saat diaktifkan, nilai string ini mengubah format `ds_sk` dan `ds_pk` catatan yang digunakan oleh tabel sinkronisasi delta saat pembuatan versi telah diaktifkan (untuk informasi selengkapnya, lihat [Deteksi konflik dan sinkronisasi](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di Panduan Pengembang AWS AppSync ).* Saat diaktifkan, pemrosesan `populateIndexFields` entri juga diaktifkan. Bidang ini bersifat opsional.

**`populateIndexFields`**  
Nilai boolean yang, ketika diaktifkan **bersama dengan `customPartitionKey`**, membuat entri baru untuk setiap catatan dalam tabel sinkronisasi delta, khususnya di kolom dan`gsi_ds_pk`. `gsi_ds_sk` Untuk informasi selengkapnya, lihat [Deteksi dan sinkronisasi konflik](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) di *Panduan AWS AppSync Pengembang*. Bidang ini bersifat opsional. 

Item yang dihapus dari DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

## Contoh 1
<a name="js-id6"></a>

Contoh berikut adalah penangan permintaan fungsi untuk mutasi GraphQL. `deleteItem(id: ID!)` Jika ada item dengan ID ini, item tersebut akan dihapus.

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

## Contoh 2
<a name="js-id7"></a>

Contoh berikut adalah penangan permintaan fungsi untuk mutasi GraphQL. `deleteItem(id: ID!, expectedVersion: Int!)` Jika ada item dengan ID ini, item tersebut akan dihapus, tetapi hanya jika `version` bidangnya disetel ke`expectedVersion`:

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

export function request(ctx) {
  const { id, expectedVersion } = ctx.args;
  const condition = {
    id: { attributeExists: true },
    version: { eq: expectedVersion },
  };
  return {
    operation: 'DeleteItem',
    key: util.dynamodb.toMapValues({ id }),
    condition: util.transform.toDynamoDBConditionExpression(condition),
  };
}
```

Untuk informasi selengkapnya tentang DynamoDB API, lihat `DeleteItem` dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html) API.

# Kueri
<a name="js-aws-appsync-resolver-reference-dynamodb-query"></a>

Objek `Query` permintaan memungkinkan Anda memberi tahu AWS AppSync DynamoDB resolver untuk membuat `Query` permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan yang berikut:
+ Ekspresi kunci
+ Indeks mana yang akan digunakan
+ Filter tambahan apa pun
+ Berapa banyak item yang akan dikembalikan
+ Apakah akan menggunakan pembacaan yang konsisten
+ arah kueri (maju atau mundur)
+ Token pagination

Objek `Query` permintaan memiliki struktur berikut:

```
type DynamoDBQueryRequest = {
  operation: 'Query';
  query: {
    expression: string;
    expressionNames?: { [key: string]: string };
    expressionValues?: { [key: string]: any };
  };
  index?: string;
  nextToken?: string;
  limit?: number;
  scanIndexForward?: boolean;
  consistentRead?: boolean;
  select?: 'ALL_ATTRIBUTES' | 'ALL_PROJECTED_ATTRIBUTES' | 'SPECIFIC_ATTRIBUTES';
  filter?: {
    expression: string;
    expressionNames?: { [key: string]: string };
    expressionValues?: { [key: string]: any };
  };
  projection?: {
    expression: string;
    expressionNames?: { [key: string]: string };
  };
};
```

Bidang didefinisikan sebagai berikut:

## Bidang kueri
<a name="js-query-list"></a>

### Daftar bidang kueri
<a name="js-query-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `Query` DynamoDB, ini harus diatur ke. `Query` Nilai ini diperlukan.

** `query` **  
`query`Bagian ini memungkinkan Anda menentukan ekspresi kondisi kunci yang menjelaskan item mana yang akan diambil dari DynamoDB. Untuk informasi selengkapnya tentang cara menulis ekspresi kondisi kunci, lihat dokumentasi [DynamoDB KeyConditions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html). Bagian ini harus ditentukan.    
** `expression` **  
Ekspresi kueri. Bidang ini harus ditentukan.  
** `expressionNames` **  
Substitusi untuk placeholder *nama* atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nama yang digunakan dalam`expression`, dan nilainya harus berupa string yang sesuai dengan nama atribut item di DynamoDB. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam. `expression`  
** `expressionValues` **  
Substitusi untuk placeholder *nilai* atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nilai yang digunakan dalam`expression`, dan nilainya harus berupa nilai yang diketik. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nilai atribut ekspresi yang digunakan dalam. `expression`

** `filter` **  
Filter tambahan yang dapat digunakan untuk memfilter hasil dari DynamoDB sebelum dikembalikan. Untuk informasi selengkapnya tentang filter, lihat [Menyaring](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Bidang ini bersifat opsional.

** `index` **  
Nama indeks untuk query. Operasi query DynamoDB memungkinkan Anda untuk memindai Indeks Sekunder Lokal dan Indeks Sekunder Global selain indeks kunci utama untuk kunci hash. Jika ditentukan, ini memberitahu DynamoDB untuk query indeks tertentu. Jika dihilangkan, indeks kunci utama ditanyakan.

** `nextToken` **  
Token pagination untuk melanjutkan kueri sebelumnya. Ini akan diperoleh dari kueri sebelumnya. Bidang ini bersifat opsional.

** `limit` **  
Jumlah maksimum item untuk dievaluasi (tidak selalu merupakan jumlah item yang cocok). Bidang ini bersifat opsional.

** `scanIndexForward` **  
Boolean yang menunjukkan apakah akan melakukan kueri maju atau mundur. Bidang ini opsional, dan defaultnya. `true`

** `consistentRead` **  
Boolean yang menunjukkan apakah akan menggunakan pembacaan yang konsisten saat menanyakan DynamoDB. Bidang ini opsional, dan defaultnya. `false`

** `select` **  
Secara default, AWS AppSync DynamoDB resolver hanya mengembalikan atribut yang diproyeksikan ke dalam indeks. Jika lebih banyak atribut diperlukan, Anda dapat mengatur bidang ini. Bidang ini bersifat opsional. Nilai yang didukung adalah:    
** `ALL_ATTRIBUTES` **  
Mengembalikan semua atribut item dari tabel tertentu atau indeks. Jika Anda menanyakan indeks sekunder lokal, DynamoDB mengambil seluruh item dari tabel induk untuk setiap item yang cocok dalam indeks. Jika indeks dikonfigurasi untuk memproyeksikan semua atribut item, semua data dapat diperoleh dari indeks sekunder lokal dan tidak diperlukan pengambilan.  
** `ALL_PROJECTED_ATTRIBUTES` **  
Diizinkan hanya saat menanyakan indeks. Mengambil semua atribut yang telah diproyeksikan ke dalam indeks. Jika indeks dikonfigurasi untuk memproyeksikan semua atribut, nilai pengembalian ini setara dengan menentukan`ALL_ATTRIBUTES`.  
**`SPECIFIC_ATTRIBUTES`**  
Mengembalikan hanya atribut yang tercantum dalam `projection`'s`expression`. Nilai pengembalian ini setara dengan menentukan `projection`'s `expression` tanpa menentukan nilai apa pun untuk. `Select`

**`projection`**  
Proyeksi yang digunakan untuk menentukan atribut yang akan dikembalikan dari operasi DynamoDB. Untuk informasi selengkapnya tentang proyeksi, lihat [Proyeksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Bidang ini bersifat opsional.

Hasil dari DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

Hasilnya memiliki struktur sebagai berikut:

```
{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10
}
```

Bidang didefinisikan sebagai berikut:

** `items` **  
Daftar yang berisi item yang dikembalikan oleh query DynamoDB.

** `nextToken` **  
Jika mungkin ada lebih banyak hasil, `nextToken` berisi token pagination yang dapat Anda gunakan dalam permintaan lain. Perhatikan bahwa AWS AppSync mengenkripsi dan mengaburkan token pagination yang dikembalikan dari DynamoDB. Ini mencegah data tabel Anda bocor secara tidak sengaja ke penelepon. Perhatikan juga bahwa token pagination ini tidak dapat digunakan di berbagai fungsi atau resolver.

** `scannedCount` **  
Jumlah item yang cocok dengan ekspresi kondisi kueri, sebelum ekspresi filter (jika ada) diterapkan.

## Contoh
<a name="js-id9"></a>

Contoh berikut adalah handler permintaan fungsi untuk query GraphQL. `getPosts(owner: ID!)`

Dalam contoh ini, indeks sekunder global pada tabel ditanyakan untuk mengembalikan semua posting yang dimiliki oleh ID yang ditentukan.

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

export function request(ctx) {
  const { owner } = ctx.args;
  return {
    operation: 'Query',
    query: {
      expression: 'ownerId = :ownerId',
      expressionValues: util.dynamodb.toMapValues({ ':ownerId': owner }),
    },
    index: 'owner-index',
  };
}
```

Untuk informasi selengkapnya tentang DynamoDB API, lihat `Query` dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html) API.

# Scan
<a name="js-aws-appsync-resolver-reference-dynamodb-scan"></a>

`Scan`Permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `Scan` permintaan ke DynamoDB, dan memungkinkan Anda untuk menentukan yang berikut:
+ Filter untuk mengecualikan hasil
+ Indeks mana yang akan digunakan
+ Berapa banyak item yang akan dikembalikan
+ Apakah akan menggunakan pembacaan yang konsisten
+ Token pagination
+ Pemindaian paralel

Objek `Scan` permintaan memiliki struktur berikut:

```
type DynamoDBScanRequest = {
  operation: 'Scan';
  index?: string;
  limit?: number;
  consistentRead?: boolean;
  nextToken?: string;
  totalSegments?: number;
  segment?: number;
  filter?: {
    expression: string;
    expressionNames?: { [key: string]: string };
    expressionValues?: { [key: string]: any };
  };
  projection?: {
    expression: string;
    expressionNames?: { [key: string]: string };
  };
};
```

Bidang didefinisikan sebagai berikut:

## Pindai bidang
<a name="js-scan-list"></a>

### Pindai daftar bidang
<a name="js-scan-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `Scan` DynamoDB, ini harus diatur ke. `Scan` Nilai ini diperlukan.

** `filter` **  
Filter yang dapat digunakan untuk memfilter hasil dari DynamoDB sebelum dikembalikan. Untuk informasi selengkapnya tentang filter, lihat [Menyaring](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Bidang ini bersifat opsional.

** `index` **  
Nama indeks untuk query. Operasi query DynamoDB memungkinkan Anda untuk memindai Indeks Sekunder Lokal dan Indeks Sekunder Global selain indeks kunci utama untuk kunci hash. Jika ditentukan, ini memberitahu DynamoDB untuk query indeks tertentu. Jika dihilangkan, indeks kunci utama ditanyakan.

** `limit` **  
Jumlah maksimum item untuk dievaluasi pada satu waktu. Bidang ini bersifat opsional.

** `consistentRead` **  
Boolean yang menunjukkan apakah akan menggunakan pembacaan yang konsisten saat menanyakan DynamoDB. Bidang ini opsional, dan defaultnya. `false`

** `nextToken` **  
Token pagination untuk melanjutkan kueri sebelumnya. Ini akan diperoleh dari kueri sebelumnya. Bidang ini bersifat opsional.

** `select` **  
Secara default, fungsi AWS AppSync DynamoDB hanya mengembalikan atribut apa pun yang diproyeksikan ke dalam indeks. Jika lebih banyak atribut diperlukan, maka bidang ini dapat diatur. Bidang ini bersifat opsional. Nilai yang didukung adalah:    
** `ALL_ATTRIBUTES` **  
Mengembalikan semua atribut item dari tabel tertentu atau indeks. Jika Anda menanyakan indeks sekunder lokal, DynamoDB mengambil seluruh item dari tabel induk untuk setiap item yang cocok dalam indeks. Jika indeks dikonfigurasi untuk memproyeksikan semua atribut item, semua data dapat diperoleh dari indeks sekunder lokal dan tidak diperlukan pengambilan.  
** `ALL_PROJECTED_ATTRIBUTES` **  
Diizinkan hanya saat menanyakan indeks. Mengambil semua atribut yang telah diproyeksikan ke dalam indeks. Jika indeks dikonfigurasi untuk memproyeksikan semua atribut, nilai pengembalian ini setara dengan menentukan`ALL_ATTRIBUTES`.  
**`SPECIFIC_ATTRIBUTES`**  
Mengembalikan hanya atribut yang tercantum dalam `projection`'s`expression`. Nilai pengembalian ini setara dengan menentukan `projection`'s `expression` tanpa menentukan nilai apa pun untuk. `Select`

** `totalSegments` **  
Jumlah segmen untuk mempartisi tabel dengan saat melakukan pemindaian paralel. Bidang ini opsional, tetapi harus ditentukan jika `segment` ditentukan.

** `segment` **  
Segmen tabel dalam operasi ini saat melakukan pemindaian paralel. Bidang ini opsional, tetapi harus ditentukan jika `totalSegments` ditentukan.

**`projection`**  
Proyeksi yang digunakan untuk menentukan atribut yang akan dikembalikan dari operasi DynamoDB. Untuk informasi selengkapnya tentang proyeksi, lihat [Proyeksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Bidang ini bersifat opsional.

Hasil yang dikembalikan oleh pemindaian DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

Hasilnya memiliki struktur sebagai berikut:

```
{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10
}
```

Bidang didefinisikan sebagai berikut:

** `items` **  
Daftar yang berisi item yang dikembalikan oleh pemindaian DynamoDB.

** `nextToken` **  
Jika mungkin ada lebih banyak hasil, `nextToken` berisi token pagination yang dapat Anda gunakan dalam permintaan lain. AWS AppSync mengenkripsi dan mengaburkan token pagination yang dikembalikan dari DynamoDB. Ini mencegah data tabel Anda bocor secara tidak sengaja ke penelepon. Selain itu, token pagination ini tidak dapat digunakan di berbagai fungsi atau resolver.

** `scannedCount` **  
Jumlah item yang diambil oleh DynamoDB sebelum ekspresi filter (jika ada) diterapkan.

## Contoh 1
<a name="js-id11"></a>

Contoh berikut adalah handler permintaan fungsi untuk query GraphQL:. `allPosts`

Dalam contoh ini, semua entri dalam tabel dikembalikan.

```
export function request(ctx) {
  return { operation: 'Scan' };
}
```

## Contoh 2
<a name="js-id12"></a>

Contoh berikut adalah handler permintaan fungsi untuk query GraphQL:. `postsMatching(title: String!)`

Dalam contoh ini, semua entri dalam tabel dikembalikan di mana judul dimulai dengan `title` argumen.

```
export function request(ctx) {
  const { title } = ctx.args;
  const filter = { filter: { beginsWith: title } };
  return {
    operation: 'Scan',
    filter: JSON.parse(util.transform.toDynamoDBFilterExpression(filter)),
  };
}
```

Untuk informasi selengkapnya tentang DynamoDB API, lihat `Scan` dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html) API.

# Sinkronkan
<a name="js-aws-appsync-resolver-reference-dynamodb-sync"></a>

Objek `Sync` permintaan memungkinkan Anda mengambil semua hasil dari tabel DynamoDB dan kemudian hanya menerima data yang diubah sejak kueri terakhir Anda (pembaruan delta). `Sync`permintaan hanya dapat dibuat ke sumber data DynamoDB berversi. Anda dapat menentukan sebagai berikut:
+ Filter untuk mengecualikan hasil
+ Berapa banyak item yang akan dikembalikan
+ Token Paginasi
+ Ketika `Sync` operasi terakhir Anda dimulai

Objek `Sync` permintaan memiliki struktur berikut:

```
type DynamoDBSyncRequest = {
  operation: 'Sync';
  basePartitionKey?: string;
  deltaIndexName?: string;
  limit?: number;
  nextToken?: string;
  lastSync?: number;
  filter?: {
    expression: string;
    expressionNames?: { [key: string]: string };
    expressionValues?: { [key: string]: any };
  };
};
```

Bidang didefinisikan sebagai berikut:

## Bidang sinkronisasi
<a name="js-sync-list"></a>

### Daftar bidang sinkronisasi
<a name="js-sync-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan `Sync` operasi, ini harus diatur ke`Sync`. Nilai ini diperlukan.

** `filter` **  
Filter yang dapat digunakan untuk memfilter hasil dari DynamoDB sebelum dikembalikan. Untuk informasi selengkapnya tentang filter, lihat [Menyaring](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Bidang ini bersifat opsional.

** `limit` **  
Jumlah maksimum item untuk dievaluasi pada satu waktu. Bidang ini bersifat opsional. Jika dihilangkan, batas default akan diatur ke `100` item. Nilai maksimum untuk bidang ini adalah `1000` item.

** `nextToken` **  
Token pagination untuk melanjutkan kueri sebelumnya. Ini akan diperoleh dari kueri sebelumnya. Bidang ini bersifat opsional.

** `lastSync` **  
Momen, dalam milidetik zaman, ketika `Sync` operasi sukses terakhir dimulai. Jika ditentukan, hanya item yang telah berubah setelah `lastSync` dikembalikan. Bidang ini opsional, dan hanya boleh diisi setelah mengambil semua halaman dari operasi awal`Sync`. Jika dihilangkan, hasil dari tabel *Base* akan dikembalikan, jika tidak, hasil dari tabel *Delta* akan dikembalikan.

**`basePartitionKey`**  
Kunci partisi dari tabel *Basis* yang digunakan saat melakukan `Sync` operasi. Bidang ini memungkinkan `Sync` operasi yang akan dilakukan ketika tabel menggunakan kunci partisi kustom. Ini adalah bidang opsional.

**`deltaIndexName`**  
Indeks yang digunakan untuk `Sync` operasi. Indeks ini diperlukan untuk mengaktifkan `Sync` operasi di seluruh tabel penyimpanan delta saat tabel menggunakan kunci partisi khusus. `Sync`Operasi akan dilakukan pada GSI (dibuat pada `gsi_ds_pk` dan`gsi_ds_sk`). Bidang ini bersifat opsional.

Hasil yang dikembalikan oleh sinkronisasi DynamoDB secara otomatis diubah menjadi tipe primitif GraphQL dan JSON dan tersedia dalam hasil konteks (). `context.result`

Untuk informasi selengkapnya tentang konversi tipe DynamoDB, [lihat Mengetik sistem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)pemetaan respons).

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

Hasilnya memiliki struktur sebagai berikut:

```
{
    items = [ ... ],
    nextToken = "a pagination token",
    scannedCount = 10,
    startedAt = 1550000000000
}
```

Bidang didefinisikan sebagai berikut:

** `items` **  
Daftar yang berisi item yang dikembalikan oleh sinkronisasi.

** `nextToken` **  
Jika mungkin ada lebih banyak hasil, `nextToken` berisi token pagination yang dapat Anda gunakan dalam permintaan lain. AWS AppSync mengenkripsi dan mengaburkan token pagination yang dikembalikan dari DynamoDB. Ini mencegah data tabel Anda bocor secara tidak sengaja ke penelepon. Selain itu, token pagination ini tidak dapat digunakan di berbagai fungsi atau resolver.

** `scannedCount` **  
Jumlah item yang diambil oleh DynamoDB sebelum ekspresi filter (jika ada) diterapkan.

** `startedAt` **  
Saat ini, dalam milidetik epoch, ketika operasi sinkronisasi dimulai yang dapat Anda simpan secara lokal dan gunakan dalam permintaan lain sebagai argumen Anda. `lastSync` Jika token pagination disertakan dalam permintaan, nilai ini akan sama dengan yang dikembalikan oleh permintaan untuk halaman pertama hasil.

## Contoh
<a name="js-id14"></a>

Contoh berikut adalah handler permintaan fungsi untuk query GraphQL:. `syncPosts(nextToken: String, lastSync: AWSTimestamp)`

Dalam contoh ini, jika `lastSync` dihilangkan, semua entri dalam tabel dasar dikembalikan. Jika `lastSync` disediakan, hanya entri dalam tabel sinkronisasi delta yang telah berubah sejak itu `lastSync` dikembalikan.

```
export function request(ctx) {
  const { nextToken, lastSync } = ctx.args;
  return { operation: 'Sync', limit: 100, nextToken, lastSync };
}
```

# BatchGetItem
<a name="js-aws-appsync-resolver-reference-dynamodb-batch-get-item"></a>

Objek `BatchGetItem` permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `BatchGetItem` permintaan ke DynamoDB untuk mengambil beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan yang berikut:
+ Nama tabel tempat untuk mengambil item dari
+ Kunci item untuk mengambil dari setiap tabel

Batas `BatchGetItem` DynamoDB berlaku **dan tidak ada ekspresi kondisi** yang dapat diberikan.

Objek `BatchGetItem` permintaan memiliki struktur berikut:

```
type DynamoDBBatchGetItemRequest = {
  operation: 'BatchGetItem';
  tables: {
    [tableName: string]: {
      keys: { [key: string]: any }[];
      consistentRead?: boolean; 
      projection?: {
        expression: string;
        expressionNames?: { [key: string]: string };
      };
    };
  };
};
```

Bidang didefinisikan sebagai berikut:

## BatchGetItem bidang
<a name="js-BatchGetItem-list"></a>

### BatchGetItem daftar bidang
<a name="js-BatchGetItem-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `BatchGetItem` DynamoDB, ini harus diatur ke. `BatchGetItem` Nilai ini diperlukan.

** `tables` **  
Tabel DynamoDB untuk mengambil item dari. Nilainya adalah peta di mana nama tabel ditentukan sebagai kunci peta. Setidaknya satu meja harus disediakan. `tables`Nilai ini diperlukan.    
** `keys` **  
Daftar kunci DynamoDB yang mewakili kunci utama item yang akan diambil. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request).  
** `consistentRead` **  
Apakah akan menggunakan pembacaan yang konsisten saat menjalankan *GetItem*operasi. *Nilai ini opsional dan default ke false.*  
**`projection`**  
Proyeksi yang digunakan untuk menentukan atribut yang akan dikembalikan dari operasi DynamoDB. Untuk informasi selengkapnya tentang proyeksi, lihat [Proyeksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Bidang ini bersifat opsional.

Hal-hal yang perlu diingat:
+ Jika item belum diambil dari tabel, elemen *null* muncul di blok data untuk tabel itu.
+ Hasil pemanggilan diurutkan per tabel, berdasarkan urutan di mana mereka disediakan di dalam objek permintaan.
+ Setiap `Get` perintah di dalam a `BatchGetItem` adalah atom, namun, batch dapat diproses sebagian. *Jika batch diproses sebagian karena kesalahan, kunci yang belum diproses dikembalikan sebagai bagian dari hasil pemanggilan di dalam blok UnprocessedKeys.*
+  `BatchGetItem`terbatas pada 100 kunci.

Untuk contoh berikut fungsi request handler:

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

export function request(ctx) {
  const { authorId, postId } = ctx.args;
  return {
    operation: 'BatchGetItem',
    tables: {
      authors: [util.dynamodb.toMapValues({ authorId })],
      posts: [util.dynamodb.toMapValues({ authorId, postId })],
    },
  };
}
```

Hasil pemanggilan yang tersedia `ctx.result` adalah sebagai berikut:

```
{
   "data": {
     "authors": [null],
     "posts": [
        // Was retrieved
        {
          "authorId": "a1",
          "postId": "p2",
          "postTitle": "title",
          "postDescription": "description",
        }
     ]
   },
   "unprocessedKeys": {
     "authors": [
        // This item was not processed due to an error
        {
          "authorId": "a1"
        }
      ],
     "posts": []
   }
}
```

`ctx.error`Berisi rincian tentang kesalahan. **Data** kunci, **UnprocessedKeys**, dan setiap tombol tabel yang disediakan dalam hasil dalam objek permintaan fungsi dijamin akan hadir dalam hasil pemanggilan. Item yang telah dihapus muncul di blok **data**. Item yang belum diproses ditandai sebagai *null* di dalam blok data dan ditempatkan di dalam blok **UnprocessedKeys**.

# BatchDeleteItem
<a name="js-aws-appsync-resolver-reference-dynamodb-batch-delete-item"></a>

Objek `BatchDeleteItem` permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `BatchWriteItem` permintaan ke DynamoDB untuk menghapus beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan yang berikut:
+ Nama tabel tempat menghapus item
+ Kunci item yang akan dihapus dari setiap tabel

Batas `BatchWriteItem` DynamoDB berlaku **dan tidak ada ekspresi kondisi** yang dapat diberikan.

Objek `BatchDeleteItem` permintaan memiliki struktur berikut:

```
type DynamoDBBatchDeleteItemRequest = {
  operation: 'BatchDeleteItem';
  tables: {
    [tableName: string]: { [key: string]: any }[];
  };
};
```

Bidang didefinisikan sebagai berikut:

## BatchDeleteItem bidang
<a name="js-BatchDeleteItem-list"></a>

### BatchDeleteItem daftar bidang
<a name="js-BatchDeleteItem-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `BatchDeleteItem` DynamoDB, ini harus diatur ke. `BatchDeleteItem` Nilai ini diperlukan.

** `tables` **  
Tabel DynamoDB untuk menghapus item dari. Setiap tabel adalah daftar kunci DynamoDB yang mewakili kunci utama item yang akan dihapus. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Setidaknya satu meja harus disediakan. `tables`Nilai diperlukan.

Hal-hal yang perlu diingat:
+ Berlawanan dengan `DeleteItem` operasi, item yang dihapus sepenuhnya tidak dikembalikan dalam respons. Hanya kunci yang dilewati yang dikembalikan.
+ Jika item belum dihapus dari tabel, elemen *null* muncul di blok data untuk tabel itu.
+ Hasil pemanggilan diurutkan per tabel, berdasarkan urutan di mana mereka disediakan di dalam objek permintaan.
+ Setiap `Delete` perintah di dalam a `BatchDeleteItem` adalah atom. Namun batch dapat diproses sebagian. *Jika batch diproses sebagian karena kesalahan, kunci yang belum diproses dikembalikan sebagai bagian dari hasil pemanggilan di dalam blok UnprocessedKeys.*
+  `BatchDeleteItem`terbatas pada 25 kunci.
+ Operasi **ini tidak** didukung saat digunakan dengan deteksi konflik. Menggunakan keduanya secara bersamaan dapat mengakibatkan kesalahan.

Untuk contoh berikut fungsi request handler:

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

export function request(ctx) {
  const { authorId, postId } = ctx.args;
  return {
    operation: 'BatchDeleteItem',
    tables: {
      authors: [util.dynamodb.toMapValues({ authorId })],
      posts: [util.dynamodb.toMapValues({ authorId, postId })],
    },
  };
}
```

Hasil pemanggilan yang tersedia `ctx.result` adalah sebagai berikut:

```
{
   "data": {
     "authors": [null],
     "posts": [
        // Was deleted
        {
          "authorId": "a1",
          "postId": "p2"
        }
     ]
   },
   "unprocessedKeys": {
     "authors": [
        // This key was not processed due to an error
        {
          "authorId": "a1"
        }
      ],
     "posts": []
   }
}
```

`ctx.error`Berisi rincian tentang kesalahan. **Data** kunci, **UnprocessedKeys**, dan setiap tombol tabel yang disediakan dalam objek permintaan fungsi dijamin akan hadir dalam hasil pemanggilan. Item yang telah dihapus ada di blok **data**. Item yang belum diproses ditandai sebagai *null* di dalam blok data dan ditempatkan di dalam blok **UnprocessedKeys**.

# BatchPutItem
<a name="js-aws-appsync-resolver-reference-dynamodb-batch-put-item"></a>

Objek `BatchPutItem` permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `BatchWriteItem` permintaan ke DynamoDB untuk menempatkan beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan yang berikut:
+ Nama tabel tempat meletakkan item
+ Item lengkap untuk dimasukkan ke dalam setiap tabel

Batas `BatchWriteItem` DynamoDB berlaku **dan tidak ada ekspresi kondisi** yang dapat diberikan.

Objek `BatchPutItem` permintaan memiliki struktur berikut:

```
type DynamoDBBatchPutItemRequest = {
  operation: 'BatchPutItem';
  tables: {
    [tableName: string]: { [key: string]: any}[];
  };
};
```

Bidang didefinisikan sebagai berikut:

## BatchPutItem bidang
<a name="js-BatchPutItem-list"></a>

### BatchPutItem daftar bidang
<a name="js-BatchPutItem-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `BatchPutItem` DynamoDB, ini harus diatur ke. `BatchPutItem` Nilai ini diperlukan.

** `tables` **  
Tabel DynamoDB untuk menempatkan item di. Setiap entri tabel mewakili daftar item DynamoDB untuk disisipkan untuk tabel khusus ini. Setidaknya satu meja harus disediakan. Nilai ini diperlukan.

Hal-hal yang perlu diingat:
+ Item yang disisipkan sepenuhnya dikembalikan dalam respons, jika berhasil.
+ Jika item belum dimasukkan dalam tabel, elemen *null* ditampilkan di blok data untuk tabel tersebut.
+ Item yang disisipkan diurutkan per tabel, berdasarkan urutan di mana mereka disediakan di dalam objek permintaan.
+ Setiap `Put` perintah di dalam a `BatchPutItem` adalah atom, namun, batch dapat diproses sebagian. *Jika batch diproses sebagian karena kesalahan, kunci yang belum diproses dikembalikan sebagai bagian dari hasil pemanggilan di dalam blok UnprocessedKeys.*
+  `BatchPutItem`terbatas pada 25 item.
+ Operasi **ini tidak** didukung saat digunakan dengan deteksi konflik. Menggunakan keduanya secara bersamaan dapat mengakibatkan kesalahan.

Untuk contoh berikut fungsi request handler:

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

export function request(ctx) {
  const { authorId, postId, name, title } = ctx.args;
  return {
    operation: 'BatchPutItem',
    tables: {
      authors: [util.dynamodb.toMapValues({ authorId, name })],
      posts: [util.dynamodb.toMapValues({ authorId, postId, title })],
    },
  };
}
```

Hasil pemanggilan yang tersedia `ctx.result` adalah sebagai berikut:

```
{
   "data": {
     "authors": [
         null
     ],
     "posts": [
        // Was inserted
        {
          "authorId": "a1",
          "postId": "p2",
          "title": "title"
        }
     ]
   },
   "unprocessedItems": {
     "authors": [
        // This item was not processed due to an error
        {
          "authorId": "a1",
          "name": "a1_name"
        }
      ],
     "posts": []
   }
}
```

`ctx.error`Berisi rincian tentang kesalahan. **Data** kunci, **UnprocessEditems**, dan setiap kunci tabel yang disediakan dalam objek permintaan dijamin akan hadir dalam hasil pemanggilan. Item yang telah dimasukkan ada di blok **data**. Item yang belum diproses ditandai sebagai *null* di dalam blok data dan ditempatkan di dalam blok **UnProcessEditems**.

# TransactGetItems
<a name="js-aws-appsync-resolver-reference-dynamodb-transact-get-items"></a>

Objek `TransactGetItems` permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `TransactGetItems` permintaan ke DynamoDB untuk mengambil beberapa item, berpotensi di beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan yang berikut:
+ Nama tabel dari setiap item permintaan tempat untuk mengambil item dari
+ Kunci dari setiap item permintaan untuk diambil dari setiap tabel

Batas `TransactGetItems` DynamoDB berlaku **dan tidak ada ekspresi kondisi** yang dapat diberikan.

Objek `TransactGetItems` permintaan memiliki struktur berikut:

```
type DynamoDBTransactGetItemsRequest = {
  operation: 'TransactGetItems';
  transactItems: { table: string; key: { [key: string]: any }; projection?: { expression: string; expressionNames?: { [key: string]: string }; }[];
  };
};
```

Bidang didefinisikan sebagai berikut:

## TransactGetItems bidang
<a name="js-TransactGetItems-list"></a>

### TransactGetItems daftar bidang
<a name="js-TransactGetItems-list-col"></a>

** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `TransactGetItems` DynamoDB, ini harus diatur ke. `TransactGetItems` Nilai ini diperlukan.

** `transactItems` **  
Item permintaan untuk disertakan. Nilainya adalah array item permintaan. Setidaknya satu item permintaan harus disediakan. `transactItems`Nilai ini diperlukan.    
** `table` **  
Tabel DynamoDB untuk mengambil item dari. Nilainya adalah string dari nama tabel. `table`Nilai ini diperlukan.  
** `key` **  
Kunci DynamoDB mewakili kunci utama item yang akan diambil. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request).  
**`projection`**  
Proyeksi yang digunakan untuk menentukan atribut yang akan dikembalikan dari operasi DynamoDB. Untuk informasi selengkapnya tentang proyeksi, lihat [Proyeksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Bidang ini bersifat opsional.

Hal-hal yang perlu diingat:
+ Jika transaksi berhasil, urutan item yang diambil di `items` blok akan sama dengan urutan item permintaan.
+ Transaksi dilakukan dengan all-or-nothing cara tertentu. Jika ada item permintaan yang menyebabkan kesalahan, seluruh transaksi tidak akan dilakukan dan rincian kesalahan akan dikembalikan.
+ Item permintaan yang tidak dapat diambil bukanlah kesalahan. Sebagai gantinya, elemen *null* muncul di blok *item* di posisi yang sesuai.
+ Jika kesalahan transaksi adalah *TransactionCanceledException*, `cancellationReasons` blok akan diisi. Urutan alasan pembatalan di `cancellationReasons` blok akan sama dengan urutan item permintaan.
+  `TransactGetItems`terbatas pada 100 item permintaan.

Untuk contoh berikut fungsi request handler:

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

export function request(ctx) {
  const { authorId, postId } = ctx.args;
  return {
    operation: 'TransactGetItems',
    transactItems: [
      {
        table: 'posts',
        key: util.dynamodb.toMapValues({ postId }),
      },
      {
        table: 'authors',
        key: util.dynamodb.toMapValues({ authorId }),
      },
    ],
  };
}
```

Jika transaksi berhasil dan hanya item yang diminta pertama yang diambil, hasil pemanggilan yang tersedia adalah sebagai berikut: `ctx.result`

```
{
    "items": [
       {
           // Attributes of the first requested item
           "post_id": "p1",
           "post_title": "title",
           "post_description": "description"
       },
       // Could not retrieve the second requested item
       null,
    ],
    "cancellationReasons": null
}
```

Jika transaksi gagal karena *TransactionCanceledException*disebabkan oleh item permintaan pertama, hasil pemanggilan yang tersedia `ctx.result` adalah sebagai berikut:

```
{
    "items": null,
    "cancellationReasons": [
       {
           "type":"Sample error type",
           "message":"Sample error message"
       },
       {
           "type":"None",
           "message":"None"
       }
    ]
}
```

`ctx.error`Berisi rincian tentang kesalahan. **Item** kunci dan **CancellationReasons** dijamin akan hadir di. `ctx.result`

# TransactWriteItems
<a name="js-aws-appsync-resolver-reference-dynamodb-transact-write-items"></a>

Objek `TransactWriteItems` permintaan memungkinkan Anda memberi tahu fungsi AWS AppSync DynamoDB untuk membuat `TransactWriteItems` permintaan ke DynamoDB untuk menulis beberapa item, berpotensi ke beberapa tabel. Untuk objek permintaan ini, Anda harus menentukan yang berikut:
+ Nama tabel tujuan dari setiap item permintaan
+ Pengoperasian setiap item permintaan untuk dilakukan. Ada empat jenis operasi yang didukung: *PutItem*, *UpdateItem*, *DeleteItem*, dan *ConditionCheck* 
+ Kunci dari setiap item permintaan untuk menulis

Batas DynamoDB `TransactWriteItems` berlaku.

Objek `TransactWriteItems` permintaan memiliki struktur berikut:

```
type DynamoDBTransactWriteItemsRequest = {
  operation: 'TransactWriteItems';
  transactItems: TransactItem[];
};
type TransactItem =
  | TransactWritePutItem
  | TransactWriteUpdateItem
  | TransactWriteDeleteItem
  | TransactWriteConditionCheckItem;
type TransactWritePutItem = {
  table: string;
  operation: 'PutItem';
  key: { [key: string]: any };
  attributeValues: { [key: string]: string};
  condition?: TransactConditionCheckExpression;
};
type TransactWriteUpdateItem = {
  table: string;
  operation: 'UpdateItem';
  key: { [key: string]: any };
  update: DynamoDBExpression;
  condition?: TransactConditionCheckExpression;
};
type TransactWriteDeleteItem = {
  table: string;
  operation: 'DeleteItem';
  key: { [key: string]: any };
  condition?: TransactConditionCheckExpression;
};
type TransactWriteConditionCheckItem = {
  table: string;
  operation: 'ConditionCheck';
  key: { [key: string]: any };
  condition?: TransactConditionCheckExpression;
};
type TransactConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
  returnValuesOnConditionCheckFailure: boolean;
};
```

## TransactWriteItems bidang
<a name="js-TransactWriteItems-list"></a>

### TransactWriteItems daftar bidang
<a name="js-TransactWriteItems-list-col"></a>

**Bidang didefinisikan sebagai berikut: **    
** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `TransactWriteItems` DynamoDB, ini harus diatur ke. `TransactWriteItems` Nilai ini diperlukan.  
** `transactItems` **  
Item permintaan untuk disertakan. Nilainya adalah array item permintaan. Setidaknya satu item permintaan harus disediakan. `transactItems`Nilai ini diperlukan.  
Untuk`PutItem`, bidang didefinisikan sebagai berikut:    
** `table` **  
Tabel DynamoDB tujuan. Nilainya adalah string dari nama tabel. `table`Nilai ini diperlukan.  
** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `PutItem` DynamoDB, ini harus diatur ke. `PutItem` Nilai ini diperlukan.  
** `key` **  
Kunci DynamoDB mewakili kunci utama item yang akan diletakkan. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.  
** `attributeValues` **  
Sisa atribut item yang akan dimasukkan ke DynamoDB. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Bidang ini bersifat opsional.  
** `condition` **  
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Jika tidak ada kondisi yang ditentukan, `PutItem` permintaan akan menimpa entri yang ada untuk item tersebut. Anda dapat menentukan apakah akan mengambil kembali item yang ada saat pemeriksaan kondisi gagal. Untuk informasi selengkapnya tentang kondisi transaksional, lihat Ekspresi [kondisi transaksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Nilai ini bersifat opsional.
Untuk`UpdateItem`, bidang didefinisikan sebagai berikut:    
** `table` **  
Tabel DynamoDB untuk memperbarui. Nilainya adalah string dari nama tabel. `table`Nilai ini diperlukan.  
** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `UpdateItem` DynamoDB, ini harus diatur ke. `UpdateItem` Nilai ini diperlukan.  
** `key` **  
Kunci DynamoDB mewakili kunci utama item yang akan diperbarui. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.  
** `update` **  
`update`Bagian ini memungkinkan Anda menentukan ekspresi pembaruan yang menjelaskan cara memperbarui item di DynamoDB. Untuk informasi selengkapnya tentang cara menulis ekspresi pembaruan, lihat dokumentasi [DynamoDB UpdateExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Bagian ini diperlukan.  
** `condition` **  
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Jika tidak ada kondisi yang ditentukan, `UpdateItem` permintaan akan memperbarui entri yang ada terlepas dari statusnya saat ini. Anda dapat menentukan apakah akan mengambil kembali item yang ada saat pemeriksaan kondisi gagal. Untuk informasi selengkapnya tentang kondisi transaksional, lihat Ekspresi [kondisi transaksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Nilai ini bersifat opsional.
Untuk`DeleteItem`, bidang didefinisikan sebagai berikut:    
** `table` **  
Tabel DynamoDB untuk menghapus item. Nilainya adalah string dari nama tabel. `table`Nilai ini diperlukan.  
** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `DeleteItem` DynamoDB, ini harus diatur ke. `DeleteItem` Nilai ini diperlukan.  
** `key` **  
Tombol DynamoDB mewakili kunci utama item yang akan dihapus. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.  
** `condition` **  
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Jika tidak ada kondisi yang ditentukan, `DeleteItem` permintaan menghapus item terlepas dari keadaan saat ini. Anda dapat menentukan apakah akan mengambil kembali item yang ada saat pemeriksaan kondisi gagal. Untuk informasi selengkapnya tentang kondisi transaksional, lihat Ekspresi [kondisi transaksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Nilai ini bersifat opsional.
Untuk`ConditionCheck`, bidang didefinisikan sebagai berikut:    
** `table` **  
Tabel DynamoDB untuk memeriksa kondisi. Nilainya adalah string dari nama tabel. `table`Nilai ini diperlukan.  
** `operation` **  
Operasi DynamoDB untuk melakukan. Untuk melakukan operasi `ConditionCheck` DynamoDB, ini harus diatur ke. `ConditionCheck` Nilai ini diperlukan.  
** `key` **  
Kunci DynamoDB mewakili kunci utama item untuk pemeriksaan kondisi. Item DynamoDB mungkin memiliki kunci hash tunggal, atau kunci hash dan kunci sortir, tergantung pada struktur tabel. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Nilai ini diperlukan.  
** `condition` **  
Suatu kondisi untuk menentukan apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB. Anda dapat menentukan apakah akan mengambil kembali item yang ada saat pemeriksaan kondisi gagal. Untuk informasi selengkapnya tentang kondisi transaksional, lihat Ekspresi [kondisi transaksi](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Nilai ini diperlukan.

Hal-hal yang perlu diingat:
+ Hanya kunci item permintaan yang dikembalikan dalam respons, jika berhasil. Urutan kunci akan sama dengan urutan item permintaan.
+ Transaksi dilakukan dengan all-or-nothing cara tertentu. Jika ada item permintaan yang menyebabkan kesalahan, seluruh transaksi tidak akan dilakukan dan rincian kesalahan akan dikembalikan.
+ Tidak ada dua item permintaan yang dapat menargetkan item yang sama. Kalau tidak, mereka akan menyebabkan *TransactionCanceledException*kesalahan.
+ Jika kesalahan transaksi adalah *TransactionCanceledException*, `cancellationReasons` blok akan diisi. Jika pemeriksaan kondisi item permintaan gagal **dan** Anda tidak `returnValuesOnConditionCheckFailure` menentukan`false`, item yang ada di tabel akan diambil dan disimpan `item` di posisi `cancellationReasons` blok yang sesuai.
+  `TransactWriteItems`terbatas pada 100 item permintaan.
+ Operasi **ini tidak** didukung saat digunakan dengan deteksi konflik. Menggunakan keduanya secara bersamaan dapat mengakibatkan kesalahan.

Untuk contoh berikut fungsi request handler:

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

export function request(ctx) {
  const { authorId, postId, title, description, oldTitle, authorName } = ctx.args;
  return {
    operation: 'TransactWriteItems',
    transactItems: [
      {
        table: 'posts',
        operation: 'PutItem',
        key: util.dynamodb.toMapValues({ postId }),
        attributeValues: util.dynamodb.toMapValues({ title, description }),
        condition: util.transform.toDynamoDBConditionExpression({
          title: { eq: oldTitle },
        }),
      },
      {
        table: 'authors',
        operation: 'UpdateItem',
        key: util.dynamodb.toMapValues({ authorId }),
        update: {
          expression: 'SET authorName = :name',
          expressionValues: util.dynamodb.toMapValues({ ':name': authorName }),
        },
      },
    ],
  };
}
```

Jika transaksi berhasil, hasil pemanggilan yang tersedia `ctx.result` adalah sebagai berikut:

```
{
    "keys": [
       // Key of the PutItem request
       {
           "post_id": "p1",
       },
       // Key of the UpdateItem request
       {
           "author_id": "a1"
       }
    ],
    "cancellationReasons": null
}
```

Jika transaksi gagal karena kegagalan pemeriksaan kondisi `PutItem` permintaan, hasil pemanggilan yang tersedia `ctx.result` adalah sebagai berikut:

```
{
    "keys": null,
    "cancellationReasons": [
       {
           "item": {
               "post_id": "p1",
               "post_title": "Actual old title",
               "post_description": "Old description"
           },
           "type": "ConditionCheckFailed",
           "message": "The condition check failed."
       },
       {
           "type": "None",
           "message": "None"
       }
    ]
}
```

`ctx.error`Berisi rincian tentang kesalahan. Kunci **kunci** dan **CancellationReasons** dijamin akan ada di. `ctx.result`

# Jenis sistem (pemetaan permintaan)
<a name="js-aws-appsync-resolver-reference-dynamodb-typed-values-request"></a>

Saat menggunakan fungsi AWS AppSync DynamoDB untuk memanggil tabel DynamoDB Anda AWS AppSync , perlu mengetahui jenis setiap nilai yang akan digunakan dalam panggilan itu. Ini karena DynamoDB mendukung lebih banyak tipe primitif daripada GraphQL atau JSON (seperti set dan data biner). AWS AppSync membutuhkan beberapa petunjuk saat menerjemahkan antara GraphQL dan DynamoDB, jika tidak maka harus membuat beberapa asumsi tentang bagaimana data disusun dalam tabel Anda.

[Untuk informasi selengkapnya tentang tipe data DynamoDB, lihat deskriptor tipe Data DynamoDB dan [dokumentasi](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html#Programming.LowLevelAPI.DataTypeDescriptors) tipe data.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes)

Nilai DynamoDB diwakili oleh objek JSON yang berisi pasangan kunci-nilai tunggal. Kunci menentukan jenis DynamoDB, dan nilai menentukan nilai itu sendiri. Dalam contoh berikut, kunci `S` menunjukkan bahwa nilainya adalah string, dan nilainya `identifier` adalah nilai string itu sendiri.

```
{ "S" : "identifier" }
```

Perhatikan bahwa objek JSON tidak dapat memiliki lebih dari satu pasangan kunci-nilai. Jika lebih dari satu pasangan kunci-nilai ditentukan, objek permintaan tidak diuraikan.

Nilai DynamoDB digunakan di mana saja dalam objek permintaan di mana Anda perlu menentukan nilai. Beberapa tempat di mana Anda perlu melakukan ini termasuk: `key` dan `attributeValue` bagian, dan `expressionValues` bagian dari bagian ekspresi. Dalam contoh berikut, `identifier` nilai DynamoDB String sedang ditetapkan ke bidang `id` di bagian (mungkin dalam `key` `GetItem` objek permintaan).

```
"key" : {
   "id" : { "S" : "identifier" }
}
```

 **Tipe yang Didukung** 

AWS AppSync mendukung skalar DynamoDB, dokumen, dan jenis set berikut:

**Jenis string `S` **  
Nilai string tunggal. Nilai DynamoDB String dilambangkan dengan:  

```
{ "S" : "some string" }
```
Contoh penggunaan adalah:  

```
"key" : {
   "id" : { "S" : "some string" }
}
```

**Jenis set string `SS` **  
Satu set nilai string. Nilai DynamoDB String Set dilambangkan dengan:  

```
{ "SS" : [ "first value", "second value", ... ] }
```
Contoh penggunaan adalah:  

```
"attributeValues" : {
   "phoneNumbers" : { "SS" : [ "+1 555 123 4567", "+1 555 234 5678" ] }
}
```

**Jenis nomor `N` **  
Nilai numerik tunggal. Nilai DynamoDB Number dilambangkan dengan:  

```
{ "N" : 1234 }
```
Contoh penggunaan adalah:  

```
"expressionValues" : {
   ":expectedVersion" : { "N" : 1 }
}
```

**Jenis set nomor `NS` **  
Satu set nilai angka. Nilai DynamoDB Number Set dilambangkan dengan:  

```
{ "NS" : [ 1, 2.3, 4 ... ] }
```
Contoh penggunaan adalah:  

```
"attributeValues" : {
   "sensorReadings" : { "NS" : [ 67.8, 12.2, 70 ] }
}
```

**Tipe biner `B` **  
Nilai biner. Nilai biner DynamoDB dilambangkan dengan:  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
Perhatikan bahwa nilainya sebenarnya adalah string, di mana string adalah representasi yang dikodekan base64 dari data biner. AWS AppSync mendekode string ini kembali ke nilai binernya sebelum mengirimnya ke DynamoDB. AWS AppSync menggunakan skema decoding base64 seperti yang didefinisikan oleh RFC 2045: karakter apa pun yang tidak ada dalam alfabet base64 diabaikan.  
Contoh penggunaan adalah:  

```
"attributeValues" : {
   "binaryMessage" : { "B" : "SGVsbG8sIFdvcmxkIQo=" }
}
```

**Jenis set biner `BS` **  
Satu set nilai biner. Nilai DynamoDB Binary Set dilambangkan dengan:  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
Perhatikan bahwa nilainya sebenarnya adalah string, di mana string adalah representasi yang dikodekan base64 dari data biner. AWS AppSync mendekode string ini kembali ke nilai binernya sebelum mengirimnya ke DynamoDB. AWS AppSync menggunakan skema decoding base64 seperti yang didefinisikan oleh RFC 2045: karakter apa pun yang tidak ada dalam alfabet base64 diabaikan.  
Contoh penggunaan adalah:  

```
"attributeValues" : {
   "binaryMessages" : { "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ] }
}
```

**Jenis Boolean `BOOL` **  
Nilai Boolean. Nilai DynamoDB Boolean dilambangkan dengan:  

```
{ "BOOL" : true }
```
Perhatikan bahwa hanya `true` dan `false` merupakan nilai yang valid.  
Contoh penggunaan adalah:  

```
"attributeValues" : {
   "orderComplete" : { "BOOL" : false }
}
```

**Jenis daftar `L` **  
Daftar nilai DynamoDB lain yang didukung. Nilai Daftar DynamoDB dilambangkan dengan:  

```
{ "L" : [ ... ] }
```
Perhatikan bahwa nilainya adalah nilai gabungan, di mana daftar dapat berisi nol atau lebih dari nilai DynamoDB yang didukung (termasuk daftar lainnya). Daftar ini juga dapat berisi campuran dari berbagai jenis.  
Contoh penggunaan adalah:  

```
{ "L" : [
      { "S"  : "A string value" },
      { "N"  : 1 },
      { "SS" : [ "Another string value", "Even more string values!" ] }
   ]
}
```

**Jenis peta `M` **  
Mewakili kumpulan pasangan kunci-nilai yang tidak berurutan dari nilai DynamoDB lain yang didukung. Nilai DynamoDB Map dilambangkan dengan:  

```
{ "M" : { ... } }
```
Perhatikan bahwa peta dapat berisi nol atau lebih pasangan nilai kunci. Kuncinya harus berupa string, dan nilainya dapat berupa nilai DynamoDB yang didukung (termasuk peta lainnya). Peta juga dapat berisi campuran dari berbagai jenis.  
Contoh penggunaan adalah:  

```
{ "M" : {
      "someString" : { "S"  : "A string value" },
      "someNumber" : { "N"  : 1 },
      "stringSet"  : { "SS" : [ "Another string value", "Even more string values!" ] }
   }
}
```

**Jenis nol `NULL` **  
Nilai nol. Nilai DynamoDB Null dilambangkan dengan:  

```
{ "NULL" : null }
```
Contoh penggunaan adalah:  

```
"attributeValues" : {
   "phoneNumbers" : { "NULL" : null }
}
```

Untuk informasi selengkapnya tentang setiap jenis, lihat dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html).

# Jenis sistem (pemetaan respons)
<a name="js-aws-appsync-resolver-reference-dynamodb-typed-values-responses"></a>

Saat menerima respons dari DynamoDB AWS AppSync , secara otomatis mengubahnya menjadi tipe primitif GraphQL dan JSON. Setiap atribut di DynamoDB diterjemahkan dan dikembalikan dalam konteks penangan respons.

Misalnya, jika DynamoDB mengembalikan berikut ini:

```
{
    "id" : { "S" : "1234" },
    "name" : { "S" : "Nadia" },
    "age" : { "N" : 25 }
}
```

Saat hasilnya dikembalikan dari resolver pipeline Anda, AWS AppSync ubah menjadi tipe GraphQL dan JSON sebagai:

```
{
    "id" : "1234",
    "name" : "Nadia",
    "age" : 25
}
```

Bagian ini menjelaskan cara AWS AppSync mengonversi skalar DynamoDB berikut, dokumen, dan jenis set:

**Jenis string `S` **  
Nilai string tunggal. Nilai DynamoDB String dikembalikan sebagai string.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB String berikut:  

```
{ "S" : "some string" }
```
AWS AppSync mengubahnya menjadi string:  

```
"some string"
```

**Jenis set string `SS` **  
Satu set nilai string. Nilai DynamoDB String Set dikembalikan sebagai daftar string.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB String Set berikut:  

```
{ "SS" : [ "first value", "second value", ... ] }
```
AWS AppSync mengubahnya menjadi daftar string:  

```
[ "+1 555 123 4567", "+1 555 234 5678" ]
```

**Jenis nomor `N` **  
Nilai numerik tunggal. Nilai DynamoDB Number dikembalikan sebagai angka.  
Misalnya, jika DynamoDB mengembalikan nilai Nomor DynamoDB berikut:  

```
{ "N" : 1234 }
```
AWS AppSync mengubahnya menjadi angka:  

```
1234
```

**Jenis set nomor `NS` **  
Satu set nilai angka. Nilai DynamoDB Number Set dikembalikan sebagai daftar angka.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB Number Set berikut:  

```
{ "NS" : [ 67.8, 12.2, 70 ] }
```
AWS AppSync mengubahnya menjadi daftar angka:  

```
[ 67.8, 12.2, 70 ]
```

**Tipe biner `B` **  
Nilai biner. Nilai DynamoDB Binary dikembalikan sebagai string yang berisi representasi base64 dari nilai tersebut.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB Binary berikut:  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
AWS AppSync mengubahnya menjadi string yang berisi representasi base64 dari nilai:  

```
"SGVsbG8sIFdvcmxkIQo="
```
[Perhatikan bahwa data biner dikodekan dalam skema pengkodean base64 seperti yang ditentukan dalam [RFC 4648 dan RFC 2045](https://tools.ietf.org/html/rfc4648).](https://tools.ietf.org/html/rfc2045)

**Jenis set biner `BS` **  
Satu set nilai biner. Nilai DynamoDB Binary Set dikembalikan sebagai daftar string yang berisi representasi nilai base64.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB Binary Set berikut:  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
AWS AppSync mengubahnya menjadi daftar string yang berisi representasi nilai base64:  

```
[ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ]
```
[Perhatikan bahwa data biner dikodekan dalam skema pengkodean base64 seperti yang ditentukan dalam [RFC 4648 dan RFC 2045](https://tools.ietf.org/html/rfc4648).](https://tools.ietf.org/html/rfc2045)

**Jenis Boolean `BOOL` **  
Nilai Boolean. Nilai DynamoDB Boolean dikembalikan sebagai Boolean.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB Boolean berikut:  

```
{ "BOOL" : true }
```
AWS AppSync mengubahnya menjadi Boolean:  

```
true
```

**Jenis daftar `L` **  
Daftar nilai DynamoDB lain yang didukung. Nilai Daftar DynamoDB dikembalikan sebagai daftar nilai, di mana setiap nilai batin juga dikonversi.  
Misalnya, jika DynamoDB mengembalikan nilai Daftar DynamoDB berikut:  

```
{ "L" : [
      { "S"  : "A string value" },
      { "N"  : 1 },
      { "SS" : [ "Another string value", "Even more string values!" ] }
   ]
}
```
AWS AppSync mengubahnya menjadi daftar nilai yang dikonversi:  

```
[ "A string value", 1, [ "Another string value", "Even more string values!" ] ]
```

**Jenis peta `M` **  
 key/value Kumpulan nilai DynamoDB lain yang didukung. Nilai DynamoDB Map dikembalikan sebagai objek JSON, di mana key/value masing-masing juga dikonversi.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB Map berikut:  

```
{ "M" : {
      "someString" : { "S"  : "A string value" },
      "someNumber" : { "N"  : 1 },
      "stringSet"  : { "SS" : [ "Another string value", "Even more string values!" ] }
   }
}
```
AWS AppSync mengubahnya menjadi objek JSON:  

```
{
   "someString" : "A string value",
   "someNumber" : 1,
   "stringSet"  : [ "Another string value", "Even more string values!" ]
}
```

**Jenis nol `NULL` **  
Nilai nol.  
Misalnya, jika DynamoDB mengembalikan nilai DynamoDB Null berikut:  

```
{ "NULL" : null }
```
AWS AppSync mengubahnya menjadi null:  

```
null
```

# Penyaring
<a name="js-aws-appsync-resolver-reference-dynamodb-filter"></a>

Saat menanyakan objek di DynamoDB menggunakan `Query` operasi `Scan` dan, Anda dapat secara opsional menentukan `filter` a yang mengevaluasi hasil dan hanya mengembalikan nilai yang diinginkan.

Properti filter dari `Scan` permintaan `Query` atau memiliki struktur berikut:

```
type DynamoDBExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
};
```

Bidang didefinisikan sebagai berikut:

** `expression` **  
Ekspresi kueri. Untuk informasi selengkapnya tentang cara menulis ekspresi filter, lihat dokumentasi [DynamoDB [dan QueryFilter ScanFilter](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ScanFilter.html) DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html). Bidang ini harus ditentukan.

** `expressionNames` **  
Substitusi untuk placeholder *nama* atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci tersebut sesuai dengan placeholder nama yang digunakan dalam file. `expression` Nilai harus berupa string yang sesuai dengan nama atribut item di DynamoDB. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam. `expression`

** `expressionValues` **  
Substitusi untuk placeholder *nilai* atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nilai yang digunakan dalam`expression`, dan nilainya harus berupa nilai yang diketik. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Ini harus ditentukan. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nilai atribut ekspresi yang digunakan dalam. `expression`

## Contoh
<a name="js-id18"></a>

Contoh berikut adalah bagian filter untuk permintaan, di mana entri diambil dari DynamoDB hanya dikembalikan jika judul dimulai dengan argumen. `title` 

Di sini kita menggunakan `util.transform.toDynamoDBFilterExpression` untuk secara otomatis membuat filter dari objek:

```
const filter = util.transform.toDynamoDBFilterExpression({
  title: { beginsWith: 'far away' },
});

const request = {};
request.filter = JSON.parse(filter);
```

Ini menghasilkan filter berikut:

```
{
  "filter": {
    "expression": "(begins_with(#title,:title_beginsWith))",
    "expressionNames": { "#title": "title" },
    "expressionValues": {
      ":title_beginsWith": { "S": "far away" }
    }
  }
}
```

# Ekspresi kondisi
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-expressions"></a>

Saat Anda mengubah objek di DynamoDB dengan menggunakan operasi`PutItem`,`UpdateItem`, dan `DeleteItem` DynamoDB, Anda dapat secara opsional menentukan ekspresi kondisi yang mengontrol apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB sebelum operasi dilakukan.

Fungsi AWS AppSync DynamoDB memungkinkan ekspresi kondisi yang akan ditentukan `PutItem` dalam`UpdateItem`,, `DeleteItem` dan meminta objek, dan juga strategi untuk mengikuti jika kondisi gagal dan objek tidak diperbarui.

## Contoh 1
<a name="js-id19"></a>

Objek `PutItem` permintaan berikut tidak memiliki ekspresi kondisi. Akibatnya, ia menempatkan item di DynamoDB bahkan jika item dengan kunci yang sama sudah ada, sehingga menimpa item yang ada.

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

## Contoh 2
<a name="js-id20"></a>

`PutItem`Objek berikut memang memiliki ekspresi kondisi yang memungkinkan operasi berhasil hanya jika item dengan kunci yang sama *tidak* ada di DynamoDB.

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

Secara default, jika pemeriksaan kondisi gagal, fungsi AWS AppSync DynamoDB memberikan kesalahan untuk mutasi.

Namun, fungsi AWS AppSync DynamoDB menawarkan beberapa fitur tambahan untuk membantu pengembang menangani beberapa kasus tepi umum:
+ Jika fungsi AWS AppSync DynamoDB dapat menentukan bahwa nilai saat ini di DynamoDB cocok dengan hasil yang diinginkan, ia memperlakukan operasi seolah-olah berhasil pula.
+ Alih-alih mengembalikan kesalahan, Anda dapat mengonfigurasi fungsi untuk memanggil fungsi Lambda khusus untuk memutuskan bagaimana fungsi AWS AppSync DynamoDB harus menangani kegagalan.

Ini dijelaskan secara lebih rinci di bagian [Menangani kegagalan pemeriksaan kondisi](#condition-check).

[Untuk informasi selengkapnya tentang ekspresi kondisi DynamoDB, lihat dokumentasi DynamoDB. ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)

## Menentukan suatu kondisi
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-specification"></a>

Objek `PutItem``UpdateItem`,, dan `DeleteItem` permintaan semuanya memungkinkan `condition` bagian opsional untuk ditentukan. Jika dihilangkan, tidak ada pemeriksaan kondisi yang dilakukan. Jika ditentukan, kondisi harus benar agar operasi berhasil.

`condition`Bagian memiliki struktur sebagai berikut:

```
type ConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
  equalsIgnore?: string[];
  consistentRead?: boolean;
  conditionalCheckFailedHandler?: {
    strategy: 'Custom' | 'Reject';
    lambdaArn?: string;
  };
};
```

Bidang berikut menentukan kondisi:

** `expression` **  
Ekspresi pembaruan itu sendiri. Untuk informasi selengkapnya tentang cara menulis ekspresi kondisi, lihat dokumentasi [DynamoDB ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Bidang ini harus ditentukan.

** `expressionNames` **  
Substitusi untuk placeholder nama atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nama yang digunakan dalam *ekspresi*, dan nilainya harus berupa string yang sesuai dengan nama atribut item di DynamoDB. *Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam ekspresi.*

** `expressionValues` **  
Substitusi untuk placeholder nilai atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nilai yang digunakan dalam ekspresi, dan nilainya harus berupa nilai yang diketik. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Ini harus ditentukan. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nilai atribut ekspresi yang digunakan dalam ekspresi.

Bidang yang tersisa memberi tahu fungsi AWS AppSync DynamoDB bagaimana menangani kegagalan pemeriksaan kondisi:

** `equalsIgnore` **  
Ketika pemeriksaan kondisi gagal saat menggunakan `PutItem` operasi, fungsi AWS AppSync DynamoDB membandingkan item yang saat ini ada di DynamoDB terhadap item yang coba ditulisnya. Jika mereka sama, itu memperlakukan operasi seolah-olah berhasil. Anda dapat menggunakan `equalsIgnore` bidang untuk menentukan daftar atribut yang AWS AppSync harus diabaikan saat melakukan perbandingan tersebut. Misalnya, jika satu-satunya perbedaan adalah `version` atribut, ia memperlakukan operasi seolah-olah berhasil. Bidang ini bersifat opsional.

** `consistentRead` **  
Ketika pemeriksaan kondisi gagal, AWS AppSync dapatkan nilai item saat ini dari DynamoDB menggunakan pembacaan yang sangat konsisten. Anda dapat menggunakan bidang ini untuk memberi tahu fungsi AWS AppSync DynamoDB agar menggunakan pembacaan yang konsisten pada akhirnya. Bidang ini opsional, dan defaultnya. `true`

** `conditionalCheckFailedHandler` **  
Bagian ini memungkinkan Anda untuk menentukan bagaimana fungsi AWS AppSync DynamoDB memperlakukan kegagalan pemeriksaan kondisi setelah membandingkan nilai saat ini di DynamoDB terhadap hasil yang diharapkan. Bagian ini opsional. Jika dihilangkan, itu default ke strategi. `Reject`    
** `strategy` **  
Strategi yang diambil oleh fungsi AWS AppSync DynamoDB setelah membandingkan nilai saat ini di DynamoDB dengan hasil yang diharapkan. Bidang ini diperlukan dan memiliki nilai yang mungkin berikut:    
** `Reject` **  
Mutasi gagal, dan kesalahan ditambahkan ke respons GraphQL.  
** `Custom` **  
Fungsi AWS AppSync DynamoDB memanggil fungsi Lambda kustom untuk memutuskan bagaimana menangani kegagalan pemeriksaan kondisi. Ketika `strategy` diatur ke`Custom`, `lambdaArn` bidang harus berisi ARN dari fungsi Lambda untuk dipanggil.  
** `lambdaArn` **  
ARN dari fungsi Lambda untuk memanggil yang menentukan bagaimana fungsi DynamoDB harus menangani kegagalan pemeriksaan AWS AppSync kondisi. Bidang ini hanya harus ditentukan ketika `strategy` diatur ke`Custom`. Untuk informasi selengkapnya tentang cara menggunakan fitur ini, lihat [Menangani kegagalan pemeriksaan kondisi](#condition-check).

## Menangani kegagalan pemeriksaan kondisi
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-handling"></a>

Ketika pemeriksaan kondisi gagal, fungsi AWS AppSync DynamoDB dapat meneruskan kesalahan untuk mutasi dan nilai objek saat ini dengan menggunakan utilitas. `util.appendError` Namun, fungsi AWS AppSync DynamoDB menawarkan beberapa fitur tambahan untuk membantu pengembang menangani beberapa kasus tepi umum:
+ Jika fungsi AWS AppSync DynamoDB dapat menentukan bahwa nilai saat ini di DynamoDB cocok dengan hasil yang diinginkan, ia memperlakukan operasi seolah-olah berhasil pula.
+ Alih-alih mengembalikan kesalahan, Anda dapat mengonfigurasi fungsi untuk memanggil fungsi Lambda khusus untuk memutuskan bagaimana fungsi AWS AppSync DynamoDB harus menangani kegagalan.

Diagram alur untuk proses ini adalah:

![\[Flowchart showing process for transforming requests with mutation attempts and value checks.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/DynamoDB-condition-check-failure-handling.png)


### Memeriksa hasil yang diinginkan
<a name="js-checking-for-the-desired-result"></a>

Ketika pemeriksaan kondisi gagal, fungsi AWS AppSync DynamoDB melakukan permintaan DynamoDB untuk mendapatkan `GetItem` nilai item saat ini dari DynamoDB. Secara default, ini menggunakan pembacaan yang sangat konsisten, namun ini dapat dikonfigurasi menggunakan `consistentRead` bidang di `condition` blok dan membandingkannya dengan hasil yang diharapkan:
+ Untuk `PutItem` operasi, fungsi AWS AppSync DynamoDB membandingkan nilai saat ini terhadap nilai yang mencoba untuk menulis, tidak termasuk atribut yang tercantum dalam dari perbandingan. `equalsIgnore` Jika itemnya sama, ia memperlakukan operasi sebagai berhasil dan mengembalikan item yang diambil dari DynamoDB. Jika tidak, ia mengikuti strategi yang dikonfigurasi.

  Misalnya, jika objek `PutItem` permintaan terlihat seperti berikut:

  ```
  import { util } from '@aws-appsync/utils';
  export function request(ctx) {
    const { id, name, version} = ctx.args
    return {
      operation: 'PutItem',
      key: util.dynamodb.toMapValues({foo, bar}),
      attributeValues: util.dynamodb.toMapValues({ name, version: version+1 }),
      condition: { 
        expression: "version = :expectedVersion",
        expressionValues: util.dynamodb.toMapValues({':expectedVersion': version}),
        equalsIgnore: ['version']
      }
    };
  }
  ```

  Dan item yang saat ini ada di DynamoDB terlihat seperti berikut:

  ```
  {
     "id" : { "S" : "1" },
     "name" : { "S" : "Steve" },
     "version" : { "N" : 8 }
  }
  ```

  Fungsi AWS AppSync DynamoDB akan membandingkan item yang coba ditulisnya dengan nilai saat ini, melihat bahwa satu-satunya perbedaan adalah `version` bidang, tetapi karena dikonfigurasi untuk mengabaikan `version` bidang, ia memperlakukan operasi sebagai berhasil dan mengembalikan item yang diambil dari DynamoDB.
+ Untuk `DeleteItem` operasi, fungsi AWS AppSync DynamoDB memeriksa untuk memverifikasi bahwa item dikembalikan dari DynamoDB. Jika tidak ada barang yang dikembalikan, itu memperlakukan operasi sebagai berhasil. Jika tidak, ia mengikuti strategi yang dikonfigurasi.
+ Untuk `UpdateItem` operasi, fungsi AWS AppSync DynamoDB tidak memiliki informasi yang cukup untuk menentukan apakah item saat ini di DynamoDB cocok dengan hasil yang diharapkan, dan oleh karena itu mengikuti strategi yang dikonfigurasi.

Jika status objek saat ini di DynamoDB berbeda dari hasil yang diharapkan, fungsi AWS AppSync DynamoDB mengikuti strategi yang dikonfigurasi, untuk menolak mutasi atau memanggil fungsi Lambda untuk menentukan apa yang harus dilakukan selanjutnya.

### Mengikuti strategi “tolak”
<a name="js-following-the-reject-strategy"></a>

Saat mengikuti `Reject` strategi, fungsi AWS AppSync DynamoDB mengembalikan kesalahan untuk mutasi.

Misalnya, mengingat permintaan mutasi berikut:

```
mutation {
    updatePerson(id: 1, name: "Steve", expectedVersion: 1) {
        Name
        theVersion
    }
}
```

Jika item yang dikembalikan dari DynamoDB terlihat seperti berikut:

```
{
   "id" : { "S" : "1" },
   "name" : { "S" : "Steve" },
   "version" : { "N" : 8 }
}
```

Dan fungsi respon handler terlihat seperti berikut:

```
import { util } from '@aws-appsync/utils';
export function response(ctx) {
  const { version, ...values } = ctx.result;
  const result = { ...values, theVersion: version };
  if (ctx.error) {
    if (error) {
      return util.appendError(error.message, error.type, result, null);
    }
  }
  return result
}
```

Respons GraphQL terlihat seperti berikut:

```
{
  "data": null,
  "errors": [
    {
      "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ)"
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      ...
    }
  ]
}
```

Juga, jika ada bidang dalam objek yang dikembalikan diisi oleh resolver lain dan mutasi telah berhasil, mereka tidak akan diselesaikan ketika objek dikembalikan di bagian. `error`

### Mengikuti strategi “kustom”
<a name="js-following-the-custom-strategy"></a>

Saat mengikuti `Custom` strategi, fungsi AWS AppSync DynamoDB memanggil fungsi Lambda untuk memutuskan apa yang harus dilakukan selanjutnya. Fungsi Lambda memilih salah satu opsi berikut:
+  `reject`mutasi. Ini memberi tahu fungsi AWS AppSync DynamoDB untuk berperilaku seolah-olah strategi yang dikonfigurasi `Reject` adalah, mengembalikan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB seperti yang dijelaskan di bagian sebelumnya.
+  `discard`mutasi. Ini memberitahu fungsi AWS AppSync DynamoDB untuk diam-diam mengabaikan kegagalan pemeriksaan kondisi dan mengembalikan nilai dalam DynamoDB.
+  `retry`mutasi. Ini memberitahu fungsi AWS AppSync DynamoDB untuk mencoba lagi mutasi dengan objek permintaan baru.

 **Permintaan doa Lambda**

Fungsi AWS AppSync DynamoDB memanggil fungsi Lambda yang ditentukan dalam. `lambdaArn` Ini menggunakan `service-role-arn` konfigurasi yang sama pada sumber data. Muatan doa memiliki struktur berikut:

```
{
    "arguments": { ... },
    "requestMapping": {... },
    "currentValue": { ... },
    "resolver": { ... },
    "identity": { ... }
}
```

Bidang didefinisikan sebagai berikut:

** `arguments` **  
Argumen dari mutasi GraphQL. Ini sama dengan argumen yang tersedia untuk objek permintaan di`context.arguments`.

** `requestMapping` **  
Objek permintaan untuk operasi ini.

** `currentValue` **  
Nilai objek saat ini di DynamoDB.

** `resolver` **  
Informasi tentang AWS AppSync resolver atau fungsi.

** `identity` **  
Informasi tentang penelepon. Ini sama dengan informasi identitas yang tersedia untuk objek permintaan di`context.identity`.

Contoh lengkap dari payload:

```
{
    "arguments": {
        "id": "1",
        "name": "Steve",
        "expectedVersion": 1
    },
    "requestMapping": {
        "version" : "2017-02-28",
        "operation" : "PutItem",
        "key" : {
           "id" : { "S" : "1" }
        },
        "attributeValues" : {
           "name" : { "S" : "Steve" },
           "version" : { "N" : 2 }
        },
        "condition" : {
           "expression" : "version = :expectedVersion",
           "expressionValues" : {
               ":expectedVersion" : { "N" : 1 }
           },
           "equalsIgnore": [ "version" ]
        }
    },
    "currentValue": {
        "id" : { "S" : "1" },
        "name" : { "S" : "Steve" },
        "version" : { "N" : 8 }
    },
    "resolver": {
        "tableName": "People",
        "awsRegion": "us-west-2",
        "parentType": "Mutation",
        "field": "updatePerson",
        "outputType": "Person"
    },
    "identity": {
        "accountId": "123456789012",
        "sourceIp": "x.x.x.x",
        "user": "AIDAAAAAAAAAAAAAAAAAA",
        "userArn": "arn:aws:iam::123456789012:user/appsync"
    }
}
```

 **Tanggapan Doa Lambda** 

Fungsi Lambda dapat memeriksa payload pemanggilan dan menerapkan logika bisnis apa pun untuk memutuskan bagaimana fungsi AWS AppSync DynamoDB harus menangani kegagalan. Ada tiga opsi untuk menangani kegagalan pemeriksaan kondisi:
+  `reject`mutasi. Payload respons untuk opsi ini harus memiliki struktur ini:

  ```
  {
      "action": "reject"
  }
  ```

  Ini memberi tahu fungsi AWS AppSync DynamoDB untuk berperilaku seolah-olah strategi yang dikonfigurasi `Reject` adalah, mengembalikan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB, seperti yang dijelaskan pada bagian di atas.
+  `discard`mutasi. Payload respons untuk opsi ini harus memiliki struktur ini:

  ```
  {
      "action": "discard"
  }
  ```

  Ini memberitahu fungsi AWS AppSync DynamoDB untuk diam-diam mengabaikan kegagalan pemeriksaan kondisi dan mengembalikan nilai dalam DynamoDB.
+  `retry`mutasi. Payload respons untuk opsi ini harus memiliki struktur ini:

  ```
  {
      "action": "retry",
      "retryMapping": { ... }
  }
  ```

  Ini memberitahu fungsi AWS AppSync DynamoDB untuk mencoba lagi mutasi dengan objek permintaan baru. Struktur `retryMapping` bagian tergantung pada operasi DynamoDB, dan merupakan bagian dari objek permintaan penuh untuk operasi itu.

  Untuk`PutItem`, `retryMapping` bagian tersebut memiliki struktur sebagai berikut. Untuk deskripsi `attributeValues` lapangan, lihat [PutItem](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-putitem).

  ```
  {
      "attributeValues": { ... },
      "condition": {
          "equalsIgnore" = [ ... ],
          "consistentRead" = true
      }
  }
  ```

  Untuk`UpdateItem`, `retryMapping` bagian tersebut memiliki struktur sebagai berikut. Untuk deskripsi `update` bagian ini, lihat [UpdateItem](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem).

  ```
  {
      "update" : {
          "expression" : "someExpression"
          "expressionNames" : {
              "#foo" : "foo"
          },
          "expressionValues" : {
              ":bar" : ... typed value
          }
      },
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  Untuk`DeleteItem`, `retryMapping` bagian tersebut memiliki struktur sebagai berikut.

  ```
  {
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  Tidak ada cara untuk menentukan operasi atau kunci yang berbeda untuk dikerjakan. Fungsi AWS AppSync DynamoDB hanya memungkinkan percobaan ulang dari operasi yang sama pada objek yang sama. Juga, `condition` bagian ini tidak mengizinkan a `conditionalCheckFailedHandler` untuk ditentukan. Jika percobaan ulang gagal, fungsi AWS AppSync DynamoDB mengikuti strategi. `Reject`

Berikut adalah contoh fungsi Lambda untuk menangani permintaan yang gagal`PutItem`. Logika bisnis melihat siapa yang membuat panggilan. Jika dibuat oleh`jeffTheAdmin`, ia mencoba ulang permintaan, memperbarui `version` dan `expectedVersion` dari item yang saat ini ada di DynamoDB. Jika tidak, ia menolak mutasi.

```
exports.handler = (event, context, callback) => {
    console.log("Event: "+ JSON.stringify(event));

    // Business logic goes here.

    var response;
    if ( event.identity.user == "jeffTheAdmin" ) {
        response = {
            "action" : "retry",
            "retryMapping" : {
                "attributeValues" : event.requestMapping.attributeValues,
                "condition" : {
                    "expression" : event.requestMapping.condition.expression,
                    "expressionValues" : event.requestMapping.condition.expressionValues
                }
            }
        }
        response.retryMapping.attributeValues.version = { "N" : event.currentValue.version.N + 1 }
        response.retryMapping.condition.expressionValues[':expectedVersion'] = event.currentValue.version

    } else {
        response = { "action" : "reject" }
    }

    console.log("Response: "+ JSON.stringify(response))
    callback(null, response)
};
```

# Ekspresi kondisi transaksi
<a name="js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions"></a>

Ekspresi kondisi transaksi tersedia dalam permintaan dari keempat jenis operasi di`TransactWriteItems`, yaitu,`PutItem`,`DeleteItem`,`UpdateItem`, dan`ConditionCheck`.

Untuk`PutItem`,`DeleteItem`, dan`UpdateItem`, ekspresi kondisi transaksi adalah opsional. Untuk`ConditionCheck`, ekspresi kondisi transaksi diperlukan.

## Contoh 1
<a name="js-id22"></a>

Handler permintaan `DeleteItem` fungsi transaksional berikut tidak memiliki ekspresi kondisi. Akibatnya, ia menghapus item di DynamoDB.

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

export function request(ctx) {
  const { postId } = ctx.args;
  return {
    operation: 'TransactWriteItems',
    transactItems: [
      {
        table: 'posts',
        operation: 'DeleteItem',
        key: util.dynamodb.toMapValues({ postId }),
      }
    ],
  };
}
```

## Contoh 2
<a name="js-id23"></a>

Handler permintaan `DeleteItem` fungsi transaksional berikut memang memiliki ekspresi kondisi transaksi yang memungkinkan operasi berhasil hanya jika penulis posting itu sama dengan nama tertentu.

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

export function request(ctx) {
  const { postId, authorName} = ctx.args;
  return {
    operation: 'TransactWriteItems',
    transactItems: [
      {
        table: 'posts',
        operation: 'DeleteItem',
        key: util.dynamodb.toMapValues({ postId }),
        condition: util.transform.toDynamoDBConditionExpression({
          authorName: { eq: authorName },
        }),
      }
    ],
  };
}
```

Jika pemeriksaan kondisi gagal, itu akan menyebabkan `TransactionCanceledException` dan detail kesalahan akan dikembalikan`ctx.result.cancellationReasons`. Perhatikan bahwa secara default, item lama di DynamoDB yang membuat pemeriksaan kondisi gagal akan dikembalikan. `ctx.result.cancellationReasons`

## Menentukan suatu kondisi
<a name="js-id24"></a>

Objek `PutItem``UpdateItem`,, dan `DeleteItem` permintaan semuanya memungkinkan `condition` bagian opsional untuk ditentukan. Jika dihilangkan, tidak ada pemeriksaan kondisi yang dilakukan. Jika ditentukan, kondisi harus benar agar operasi berhasil. `ConditionCheck`Harus memiliki `condition` bagian yang akan ditentukan. Syaratnya harus benar agar seluruh transaksi berhasil.

`condition`Bagian memiliki struktur sebagai berikut:

```
type TransactConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string };
  expressionValues?: { [key: string]: string };
  returnValuesOnConditionCheckFailure: boolean;
};
```

Bidang berikut menentukan kondisi:

** `expression` **  
Ekspresi pembaruan itu sendiri. Untuk informasi selengkapnya tentang cara menulis ekspresi kondisi, lihat dokumentasi [DynamoDB ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Bidang ini harus ditentukan.

** `expressionNames` **  
Substitusi untuk placeholder nama atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nama yang digunakan dalam *ekspresi*, dan nilainya harus berupa string yang sesuai dengan nama atribut item di DynamoDB. *Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam ekspresi.*

** `expressionValues` **  
Substitusi untuk placeholder nilai atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nilai yang digunakan dalam ekspresi, dan nilainya harus berupa nilai yang diketik. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Mengetik [sistem (pemetaan permintaan)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Ini harus ditentukan. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nilai atribut ekspresi yang digunakan dalam ekspresi.

** `returnValuesOnConditionCheckFailure` **  
Tentukan apakah akan mengambil item di DynamoDB kembali ketika pemeriksaan kondisi gagal. Item yang diambil akan masuk`ctx.result.cancellationReasons[<index>].item`, di `<index>` mana indeks item permintaan yang gagal dalam pemeriksaan kondisi. Nilai ini default ke true.

# Proyeksi
<a name="js-aws-appsync-resolver-reference-dynamodb-projections"></a>

Saat membaca objek di DynamoDB menggunakan `GetItem``Scan`,,,`Query`, `TransactGetItems` dan operasi`BatchGetItem`, Anda dapat secara opsional menentukan proyeksi yang mengidentifikasi atribut yang Anda inginkan. Properti proyeksi memiliki struktur berikut, yang mirip dengan filter: 

```
type DynamoDBExpression = {
  expression: string;
  expressionNames?: { [key: string]: string}
};
```

Bidang didefinisikan sebagai berikut:

** `expression` **  
Ekspresi proyeksi, yang merupakan string. Untuk mengambil atribut tunggal, tentukan namanya. Untuk beberapa atribut, nama harus berupa nilai yang dipisahkan koma. Untuk informasi selengkapnya tentang penulisan ekspresi proyeksi, lihat dokumentasi ekspresi proyeksi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html). Bidang ini wajib diisi. 

** `expressionNames` **  
Substitusi untuk placeholder *nama* atribut ekspresi dalam bentuk pasangan kunci-nilai. Kunci tersebut sesuai dengan placeholder nama yang digunakan dalam file. `expression` Nilai harus berupa string yang sesuai dengan nama atribut item di DynamoDB. Bidang ini opsional dan hanya boleh diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam. `expression` Untuk informasi selengkapnya`expressionNames`, lihat dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html). 

## Contoh 1
<a name="js-id22"></a>

Contoh berikut adalah bagian proyeksi untuk JavaScript fungsi di mana hanya atribut `author` dan `id` dikembalikan dari DynamoDB:

```
projection : {
    expression : "#author, id",
    expressionNames : {
        "#author" : "author"
    }
}
```

**Tip**  
Anda dapat mengakses set pemilihan permintaan GraphQL Anda menggunakan. [selectionSetList](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html#aws-appsync-resolver-context-reference-info-js) Bidang ini memungkinkan Anda untuk membingkai ekspresi proyeksi Anda secara dinamis sesuai dengan kebutuhan Anda.

**catatan**  
Saat menggunakan ekspresi proyeksi dengan `Scan` operasi `Query` dan, nilai untuk `select` harus`SPECIFIC_ATTRIBUTES`. Untuk informasi selengkapnya, lihat dokumentasi [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-Select).

# AWS AppSync JavaScript referensi fungsi resolver untuk OpenSearch
<a name="resolver-reference-elasticsearch-js"></a>

 AWS AppSync Resolver untuk Amazon OpenSearch Service memungkinkan Anda menggunakan GraphQL untuk menyimpan dan mengambil data di domain Layanan yang ada di akun Anda. OpenSearch Penyelesai ini berfungsi dengan memungkinkan Anda memetakan permintaan GraphQL yang masuk ke dalam permintaan Layanan, dan kemudian memetakan OpenSearch respons Layanan kembali ke GraphQL. OpenSearch Bagian ini menjelaskan permintaan fungsi dan penangan respons untuk operasi OpenSearch Layanan yang didukung.

## Permintaan
<a name="request-js"></a>

Sebagian besar objek permintaan OpenSearch Layanan memiliki struktur umum di mana hanya beberapa bagian yang berubah. Contoh berikut menjalankan pencarian terhadap domain OpenSearch Layanan, di mana dokumen bertipe `post` dan diindeks di bawah. `id` Parameter pencarian didefinisikan di `body` bagian, dengan banyak klausa kueri umum yang didefinisikan di `query` bidang. Contoh ini akan mencari dokumen yang berisi `"Nadia"``"Bailey"`, atau, atau keduanya, di `author` bidang dokumen:

```
export function request(ctx) {
  return {
    operation: 'GET',
    path: '/id/post/_search',
    params: {
      headers: {},
      queryString: {},
      body: {
        from: 0,
        size: 50,
        query: {
          bool: {
            should: [
              { match: { author: 'Nadia' } },
              { match: { author: 'Bailey' } },
            ],
          },
        },
      },
    },
  };
}
```

## Respons
<a name="response-mapping-template"></a>

Seperti sumber data lainnya, OpenSearch Layanan mengirimkan respons AWS AppSync yang perlu dikonversi ke GraphQL.

Sebagian besar kueri GraphQL mencari bidang `_source` dari respons Layanan. OpenSearch Karena Anda dapat melakukan pencarian untuk mengembalikan dokumen individual atau daftar dokumen, ada dua pola respons umum yang digunakan dalam OpenSearch Layanan:

 **Daftar Hasil** 

```
export function response(ctx) {
  const entries = [];
  for (const entry of ctx.result.hits.hits) {
    entries.push(entry['_source']);
  }
  return entries;
}
```

 **Barang Individu** 

```
export function response(ctx) {
  return ctx.result['_source']
}
```

## `operation`lapangan
<a name="operation-field"></a>

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Metode HTTP atau kata kerja (GET, POST, PUT, HEAD atau DELETE) yang AWS AppSync mengirim ke domain OpenSearch Layanan. Baik kunci dan nilainya harus berupa string.

```
"operation" : "PUT"
```

## `path`lapangan
<a name="path-field"></a>

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Jalur pencarian untuk permintaan OpenSearch Layanan dari AWS AppSync. Ini membentuk URL untuk kata kerja HTTP operasi. Baik kunci dan nilainya harus berupa string.

```
"path" : "/indexname/type"

"path" : "/indexname/type/_search"
```

Ketika penangan permintaan dievaluasi, jalur ini dikirim sebagai bagian dari permintaan HTTP, termasuk domain OpenSearch Layanan. Misalnya, contoh sebelumnya mungkin diterjemahkan ke:

```
GET https://opensearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
```

## `params`lapangan
<a name="params-field"></a>

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Digunakan untuk menentukan tindakan apa yang dilakukan penelusuran Anda, paling umum dengan menetapkan nilai **kueri** di dalam **badan**. Namun, ada beberapa kemampuan lain yang dapat dikonfigurasi, seperti pemformatan respons.
+  **header** 

  Informasi header, sebagai pasangan kunci-nilai. Baik kunci dan nilainya harus berupa string. Contoh:

  ```
  "headers" : {
      "Content-Type" : "application/json"
  }
  ```

   
**catatan**  
AWS AppSync saat ini hanya mendukung JSON sebagai file. `Content-Type`
+  **QueryString** 

  Pasangan nilai kunci yang menentukan opsi umum, seperti pemformatan kode untuk respons JSON. Baik kunci dan nilainya harus berupa string. Misalnya, jika Anda ingin mendapatkan JSON yang diformat dengan cantik, Anda akan menggunakan:

  ```
  "queryString" : {
      "pretty" : "true"
  }
  ```
+  **tubuh** 

  Ini adalah bagian utama dari permintaan Anda, memungkinkan AWS AppSync untuk membuat permintaan pencarian yang terbentuk dengan baik ke domain OpenSearch Layanan Anda. Kuncinya harus berupa string yang terdiri dari sebuah objek. Beberapa demonstrasi ditunjukkan di bawah ini.

 **Contoh 1** 

Kembalikan semua dokumen dengan kota yang cocok dengan “seattle”:

```
export function request(ctx) {
  return {
    operation: 'GET',
    path: '/id/post/_search',
    params: {
      headers: {},
      queryString: {},
      body: { from: 0, size: 50, query: { match: { city: 'seattle' } } },
    },
  };
}
```

 **Contoh 2** 

Kembalikan semua dokumen yang cocok dengan “washington” sebagai kota atau negara bagian:

```
export function request(ctx) {
  return {
    operation: 'GET',
    path: '/id/post/_search',
    params: {
      headers: {},
      queryString: {},
      body: {
        from: 0,
        size: 50,
        query: {
          multi_match: { query: 'washington', fields: ['city', 'state'] },
        },
      },
    },
  };
}
```

## Melewati variabel
<a name="passing-variables"></a>

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Anda juga dapat meneruskan variabel sebagai bagian dari evaluasi di penangan permintaan Anda. Misalnya, Anda memiliki kueri GraphQL seperti berikut:

```
query {
    searchForState(state: "washington"){
        ...
    }
}
```

Handler permintaan fungsi bisa sebagai berikut:

```
export function request(ctx) {
  return {
    operation: 'GET',
    path: '/id/post/_search',
    params: {
      headers: {},
      queryString: {},
      body: {
        from: 0,
        size: 50,
        query: {
          multi_match: { query: ctx.args.state, fields: ['city', 'state'] },
        },
      },
    },
  };
}
```

# AWS AppSync JavaScript referensi fungsi resolver untuk Lambda
<a name="resolver-reference-lambda-js"></a>

Anda dapat menggunakan AWS AppSync fungsi dan resolver untuk menjalankan fungsi Lambda yang terletak di akun Anda. Anda dapat membentuk payload permintaan dan respons dari fungsi Lambda Anda sebelum mengembalikannya ke klien Anda. Anda juga dapat menentukan jenis operasi yang akan dilakukan di objek permintaan Anda. Bagian ini menjelaskan permintaan untuk operasi Lambda yang didukung.

## Permintaan objek
<a name="request-object-js"></a>

Objek permintaan Lambda menangani bidang yang terkait dengan fungsi Lambda Anda:

```
export type LambdaRequest = {
  operation: 'Invoke' | 'BatchInvoke';
  invocationType?: 'RequestResponse' | 'Event';
  payload: unknown;
};
```

Berikut adalah contoh yang menggunakan `invoke` operasi dengan data payloadnya menjadi `getPost` bidang dari skema GraphQL bersama dengan argumennya dari konteksnya:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Seluruh dokumen pemetaan diteruskan sebagai input ke fungsi Lambda Anda sehingga contoh sebelumnya sekarang terlihat seperti ini:

```
{
  "operation": "Invoke",
  "payload": {
    "field": "getPost",
    "arguments": {
      "input": {
        "id": "postId1",
      }
    }
  }
}
```

### Operasi
<a name="operation-js"></a>

Sumber data Lambda memungkinkan Anda menentukan dua operasi di `operation` bidang: `Invoke` dan. `BatchInvoke` `Invoke`Operasi ini memungkinkan AWS AppSync untuk memanggil fungsi Lambda Anda untuk setiap penyelesai bidang GraphQL. `BatchInvoke`menginstruksikan permintaan batch AWS AppSync untuk bidang GraphQL saat ini. Bidang `operation` wajib diisi.

Untuk`Invoke`, permintaan yang diselesaikan cocok dengan muatan input fungsi Lambda. Mari kita ubah contoh di atas:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Ini diselesaikan dan diteruskan ke fungsi Lambda, yang bisa terlihat seperti ini:

```
{
  "operation": "Invoke",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

Untuk`BatchInvoke`, permintaan diterapkan ke setiap resolver bidang dalam batch. Untuk keringkasan, AWS AppSync menggabungkan semua `payload` nilai permintaan ke dalam daftar di bawah satu objek yang cocok dengan objek permintaan. Contoh handler permintaan berikut menunjukkan penggabungan:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: ctx,
  };
}
```

Permintaan ini dievaluasi dan diselesaikan ke dalam dokumen pemetaan berikut:

```
{
  "operation": "BatchInvoke",
  "payload": [
    {...}, // context for batch item 1
    {...}, // context for batch item 2
    {...}  // context for batch item 3
  ]
}
```

Setiap elemen `payload` daftar sesuai dengan satu item batch. Fungsi Lambda juga diharapkan mengembalikan respons berbentuk daftar yang cocok dengan urutan item yang dikirim dalam permintaan:

```
[
  { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1
  { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2
  { "data": {...}, "errorMessage": null, "errorType": null }  // result for batch item 3
]
```

### Payload
<a name="payload-js"></a>

`payload`Bidang adalah wadah yang digunakan untuk meneruskan data apa pun ke fungsi Lambda. Jika `operation` bidang diatur ke`BatchInvoke`, AWS AppSync membungkus `payload` nilai yang ada ke dalam daftar. `payload`Bidang ini opsional.

### Jenis doa
<a name="async-invocation-type-js"></a>

Sumber data Lambda memungkinkan Anda menentukan dua jenis pemanggilan: dan. `RequestResponse` `Event` [Jenis pemanggilan identik dengan tipe pemanggilan yang ditentukan dalam API Lambda.](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) Jenis `RequestResponse` AWS AppSync pemanggilan memungkinkan memanggil fungsi Lambda Anda secara sinkron untuk menunggu respons. `Event`Pemanggilan memungkinkan Anda untuk menjalankan fungsi Lambda Anda secara asinkron. [Untuk informasi selengkapnya tentang cara Lambda menangani permintaan jenis `Event` pemanggilan, lihat Pemanggilan asinkron.](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html) `invocationType`Bidang ini opsional. Jika bidang ini tidak termasuk dalam permintaan, AWS AppSync akan default ke jenis `RequestResponse` pemanggilan.

Untuk `invocationType` bidang apa pun, permintaan yang diselesaikan cocok dengan muatan input fungsi Lambda. Mari kita ubah contoh di atas:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    invocationType: 'Event',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Ini diselesaikan dan diteruskan ke fungsi Lambda, yang bisa terlihat seperti ini:

```
{
  "operation": "Invoke",
  "invocationType": "Event",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

Saat `BatchInvoke` operasi digunakan bersama dengan bidang jenis `Event` pemanggilan, AWS AppSync gabungkan penyelesai bidang dengan cara yang sama seperti yang disebutkan di atas, dan permintaan diteruskan ke fungsi Lambda Anda sebagai peristiwa asinkron dengan daftar nilai. `payload` Respons dari permintaan tipe `Event` pemanggilan menghasilkan `null` nilai tanpa penangan respons:

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

Kami menyarankan Anda menonaktifkan caching resolver untuk resolver tipe `Event` pemanggilan karena ini tidak akan dikirim ke Lambda jika ada cache hit.

## Objek respons
<a name="response-object-js"></a>

Seperti sumber data lainnya, fungsi Lambda Anda mengirimkan respons AWS AppSync yang harus dikonversi ke tipe GraphQL. Hasil dari fungsi Lambda terkandung dalam properti `context` hasil ()`context.result`.

Jika bentuk respons fungsi Lambda Anda cocok dengan bentuk tipe GraphQL, Anda dapat meneruskan respons menggunakan penangan respons fungsi berikut:

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

Tidak ada bidang wajib atau batasan bentuk yang berlaku untuk objek respons. Namun, karena GraphQL diketik dengan kuat, respons yang diselesaikan harus sesuai dengan tipe GraphQL yang diharapkan.

## Respons batch fungsi Lambda
<a name="aws-appsync-resolver-reference-lambda-batched-response-js"></a>

Jika `operation` bidang diatur ke`BatchInvoke`, AWS AppSync mengharapkan daftar item kembali dari fungsi Lambda. AWS AppSync Untuk memetakan setiap hasil kembali ke item permintaan asli, daftar respons harus sesuai dengan ukuran dan urutan. Ini valid untuk memiliki `null` item dalam daftar respons; `ctx.result` diatur ke *null* sesuai.

# AWS AppSync JavaScript referensi fungsi resolver untuk sumber data EventBridge
<a name="resolver-reference-eventbridge-js"></a>

Permintaan dan respons fungsi AWS AppSync resolver yang digunakan dengan sumber EventBridge data memungkinkan Anda mengirim acara khusus ke bus Amazon EventBridge .

## Permintaan
<a name="request-js"></a>

Handler permintaan memungkinkan Anda mengirim beberapa acara khusus ke bus EventBridge acara:

```
export function request(ctx) {
  return {
    "operation" : "PutEvents",
    "events" : [{}]
  }
}
```

 EventBridge `PutEvents`Permintaan memiliki definisi tipe berikut:

```
type PutEventsRequest = {
  operation: 'PutEvents'
  events: {
    source: string
    detail: { [key: string]: any }
    detailType: string
    resources?: string[]
    time?: string // RFC3339 Timestamp format
  }[]
}
```

## Respons
<a name="response-js"></a>

Jika `PutEvents` operasi berhasil, respons dari EventBridge termasuk dalam`ctx.result`:

```
export function response(ctx) {
  if(ctx.error)
    util.error(ctx.error.message, ctx.error.type, ctx.result)
  else
    return ctx.result
}
```

Kesalahan yang terjadi saat melakukan `PutEvents` operasi seperti `InternalExceptions` atau `Timeouts` akan muncul di`ctx.error`. Untuk daftar EventBridge kesalahan umum, lihat [referensi kesalahan EventBridge umum](https://docs.aws.amazon.com/eventbridge/latest/APIReference/CommonErrors.html).

`result`Akan memiliki definisi tipe berikut:

```
type PutEventsResult = {
  Entries: {
    ErrorCode: string
    ErrorMessage: string
    EventId: string
  }[]
  FailedEntryCount: number
}
```
+ **Entri**

  Hasil acara yang dicerna, baik yang berhasil maupun yang tidak berhasil. Jika konsumsi berhasil, entri memiliki `EventID` di dalamnya. Jika tidak, Anda dapat menggunakan `ErrorCode` dan `ErrorMessage` untuk mengidentifikasi masalah dengan entri.

  Untuk setiap catatan, indeks elemen respons sama dengan indeks dalam array permintaan.
+ **FailedEntryCount**

  Jumlah entri yang gagal. Nilai ini direpresentasikan sebagai bilangan bulat.

Untuk informasi lebih lanjut tentang tanggapan`PutEvents`, lihat [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html#API_PutEvents_ResponseElements).

**Contoh respon sampel 1**

Contoh berikut adalah `PutEvents` operasi dengan dua peristiwa sukses:

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        }
    ],
    "FailedEntryCount" : 0
}
```

**Contoh respon sampel 2**

Contoh berikut adalah `PutEvents` operasi dengan tiga peristiwa, dua keberhasilan dan satu gagal:

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        },
        {
            "ErrorCode" : "SampleErrorCode",
            "ErrorMessage" : "Sample Error Message"
        }
    ],
    "FailedEntryCount" : 1
}
```

## `PutEvents`bidang
<a name="putevents-field"></a>

`PutEvents`berisi bidang template pemetaan berikut:
+ **Versi**

  Umum untuk semua template pemetaan permintaan, `version` bidang mendefinisikan versi yang digunakan template. Bidang ini wajib diisi. Nilai `2018-05-29` adalah satu-satunya versi yang didukung untuk template EventBridge pemetaan.
+ **Operasi**

  Satu-satunya operasi yang didukung adalah`PutEvents`. Operasi ini memungkinkan Anda untuk menambahkan acara khusus ke bus acara Anda.
+ **Peristiwa**

  Serangkaian acara yang akan ditambahkan ke bus acara. Array ini harus memiliki alokasi 1 - 10 item.

  `Event`Objek memiliki bidang berikut:
  + `"source"`: String yang mendefinisikan sumber acara.
  + `"detail"`: Objek JSON yang dapat Anda gunakan untuk melampirkan informasi tentang acara tersebut. Bidang ini bisa berupa peta kosong (`{ }`).
  + `"detailType`: Sebuah string yang mengidentifikasi jenis acara.
  + `"resources"`: Sebuah array JSON string yang mengidentifikasi sumber daya yang terlibat dalam acara tersebut. Bidang ini bisa berupa array kosong.
  + `"time"`: Stempel waktu acara disediakan sebagai string. Ini harus mengikuti format [RFC3339](https://www.rfc-editor.org/rfc/rfc3339.txt)stempel waktu.

Cuplikan di bawah ini adalah beberapa contoh objek yang valid`Event`:

**Contoh 1**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : [1,2,3,4],
        "key2" : "strval"
    },
    "detailType" : "sampleDetailType",
    "resources" : ["Resouce1", "Resource2"],
    "time" : "2022-01-10T05:00:10Z"
}
```

**Contoh 2**

```
{
    "source" : "source1",
    "detail" : {},
    "detailType" : "sampleDetailType"
}
```

**Contoh 3**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : 1200
    },
    "detailType" : "sampleDetailType",
    "resources" : []
}
```

# AWS AppSync JavaScript referensi fungsi resolver untuk sumber data `None`
<a name="resolver-reference-none-js"></a>

Permintaan dan respons fungsi AWS AppSync resolver dengan sumber data tipe *None* memungkinkan Anda membentuk permintaan untuk operasi AWS AppSync lokal.

## Permintaan
<a name="request-js"></a>

Handler permintaan dapat sederhana dan memungkinkan Anda untuk meneruskan informasi kontekstual sebanyak mungkin melalui lapangan. `payload`

```
type NONERequest = {
  payload: any;
};
```

Berikut adalah contoh di mana argumen bidang diteruskan ke payload:

```
export function request(ctx) {
  return {
    payload: context.args
  };
}
```

Nilai `payload` bidang akan diteruskan ke handler respons fungsi dan tersedia di. `context.result`

## Payload
<a name="payload-js"></a>

`payload`Bidang adalah wadah yang dapat digunakan untuk meneruskan data apa pun yang kemudian tersedia untuk penangan respons fungsi.

 `payload`Bidang ini opsional.

## Respons
<a name="response-js"></a>

Karena tidak ada sumber data, nilai `payload` bidang akan diteruskan ke fungsi respon handler dan diatur pada properti. `context.result`

Jika bentuk nilai `payload` bidang sama persis dengan bentuk tipe GraphQL, Anda dapat meneruskan respons menggunakan penangan respons berikut:

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

Tidak ada kolom wajib atau batasan bentuk yang berlaku untuk respons pengembalian. Namun, karena GraphQL diketik dengan kuat, respons yang diselesaikan harus sesuai dengan tipe GraphQL yang diharapkan.

# AWS AppSync JavaScript referensi fungsi resolver untuk HTTP
<a name="resolver-reference-http-js"></a>

Fungsi resolver AWS AppSync HTTP memungkinkan Anda mengirim permintaan dari titik akhir HTTP apa pun, dan tanggapan dari titik akhir HTTP Anda kembali AWS AppSync ke. AWS AppSync Dengan penangan permintaan Anda, Anda dapat memberikan petunjuk AWS AppSync tentang sifat operasi yang akan dipanggil. Bagian ini menjelaskan konfigurasi yang berbeda untuk resolver HTTP yang didukung.

## Permintaan
<a name="request-js"></a>

```
type HTTPRequest = {
  method: 'PUT' | 'POST' | 'GET' | 'DELETE' | 'PATCH';
  params?: {
    query?: { [key: string]: any };
    headers?: { [key: string]: string };
    body?: any;
  };
  resourcePath: string;
};
```

Cuplikan berikut adalah contoh permintaan HTTP POST, dengan `text/plain` badan:

```
export function request(ctx) {
  return {
    method: 'POST',
    params: {
      headers: { 'Content-Type': 'text/plain' },
      body: 'this is an example of text body',
    },
    resourcePath: '/',
  };
}
```

## Metode
<a name="method-js"></a>

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Metode HTTP atau kata kerja (GET, POST, PUT, PATCH, atau DELETE) yang AWS AppSync mengirim ke titik akhir HTTP.

```
"method": "PUT"
```

## ResourcePath
<a name="resourcepath-js"></a>

 

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Jalur sumber daya yang ingin Anda akses. Seiring dengan titik akhir di sumber data HTTP, jalur sumber daya membentuk URL tempat AWS AppSync layanan membuat permintaan.

```
"resourcePath": "/v1/users"
```

Ketika permintaan dievaluasi, jalur ini dikirim sebagai bagian dari permintaan HTTP, termasuk titik akhir HTTP. Misalnya, contoh sebelumnya mungkin menerjemahkan ke yang berikut:

```
PUT <endpoint>/v1/users
```

## Bidang Params
<a name="params-field-js"></a>

**catatan**  
Ini hanya berlaku untuk penangan Permintaan. 

Digunakan untuk menentukan tindakan apa yang dilakukan penelusuran Anda, paling sering dengan menetapkan nilai **kueri** di dalam **badan**. Namun, ada beberapa kemampuan lain yang dapat dikonfigurasi, seperti pemformatan respons.

** **header** **  
Informasi header, sebagai pasangan kunci-nilai. Baik kunci dan nilainya harus berupa string.  
Contoh:  

```
"headers" : {
    "Content-Type" : "application/json"
}
```
`Content-Type`Header yang didukung saat ini adalah:  

```
text/*
application/xml
application/json
application/soap+xml
application/x-amz-json-1.0
application/x-amz-json-1.1
application/vnd.api+json
application/x-ndjson
```
Anda tidak dapat mengatur header HTTP berikut:  

```
HOST
CONNECTION
USER-AGENT
EXPECTATION
TRANSFER_ENCODING
CONTENT_LENGTH
```

** **query** **  
Pasangan nilai kunci yang menentukan opsi umum, seperti pemformatan kode untuk respons JSON. Baik kunci dan nilainya harus berupa string. Contoh berikut menunjukkan bagaimana Anda dapat mengirim string query sebagai`?type=json`:  

```
"query" : {
    "type" : "json"
}
```

** **tubuh** **  
Tubuh berisi badan permintaan HTTP yang Anda pilih untuk disetel. Badan permintaan selalu berupa string yang dikodekan UTF-8 kecuali jenis konten menentukan charset.  

```
"body":"body string"
```

## Respons
<a name="response-js"></a>

Lihat contoh [di sini](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-http-resolvers-js.html).

# AWS AppSync JavaScript referensi fungsi resolver untuk Amazon RDS
<a name="resolver-reference-rds-js"></a>

Fungsi dan resolver AWS AppSync RDS memungkinkan pengembang untuk mengirim SQL kueri ke database cluster Amazon Aurora menggunakan API Data RDS dan mendapatkan kembali hasil kueri ini. Anda dapat menulis SQL pernyataan yang dikirim ke API Data dengan menggunakan AWS AppSync template `sql` yang diberi tag `rds` modul atau dengan menggunakan fungsi `rds` modul`select`,, `insert``update`, dan `remove` pembantu. AWS AppSync menggunakan [https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html)tindakan RDS Data Service untuk menjalankan pernyataan SQL terhadap database. 

**Topik**
+ [Templat dengan tag SQL](#sql-tagged-templates)
+ [Membuat pernyataan](#creating-statements)
+ [Mengambil data](#retrieving-data)
+ [Fungsi utilitas](#utility-functions)
+ [SQL Pilih](#utility-functions-select)
+ [Sisipkan SQL](#utility-functions-insert)
+ [Pembaruan SQL](#utility-functions-update)
+ [SQL Hapus](#utility-functions-delete)
+ [Casting](#casting)

## Templat dengan tag SQL
<a name="sql-tagged-templates"></a>

AWS AppSync template yang `sql` diberi tag memungkinkan Anda membuat pernyataan statis yang dapat menerima nilai dinamis saat runtime dengan menggunakan ekspresi template. AWS AppSync membangun peta variabel dari nilai ekspresi untuk membuat [https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html)kueri yang dikirim ke API Data Tanpa Server Amazon Aurora. Dengan metode ini, nilai dinamis tidak mungkin diteruskan pada waktu berjalan untuk memodifikasi pernyataan asli, yang dapat menyebabkan eksekusi yang tidak disengaja. Semua nilai dinamis diteruskan sebagai parameter, tidak dapat memodifikasi pernyataan asli, dan tidak dieksekusi oleh database. Ini membuat kueri Anda kurang rentan terhadap serangan SQL injeksi.

**catatan**  
Dalam semua kasus, saat menulis SQL pernyataan, Anda harus mengikuti pedoman keamanan untuk menangani data yang Anda terima sebagai input dengan benar.

**catatan**  
Template `sql` yang ditandai hanya mendukung melewati nilai variabel. Anda tidak dapat menggunakan ekspresi untuk menentukan nama kolom atau tabel secara dinamis. Namun, Anda dapat menggunakan fungsi utilitas untuk membangun pernyataan dinamis.

Dalam contoh berikut, kami membuat kueri yang memfilter berdasarkan nilai `col` argumen yang diatur secara dinamis dalam kueri GraphQL saat dijalankan. Nilai hanya dapat ditambahkan ke pernyataan menggunakan ekspresi tag:

```
import { sql, createMySQLStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
  const query = sql`
SELECT * FROM table 
WHERE column = ${ctx.args.col}`
  ;
  return createMySQLStatement(query);
}
```

Dengan meneruskan semua nilai dinamis melalui peta variabel, kami mengandalkan mesin database untuk menangani dan membersihkan nilai dengan aman.

## Membuat pernyataan
<a name="creating-statements"></a>

Fungsi dan resolver dapat berinteraksi dengan database MySQL dan PostgreSQL. Gunakan `createMySQLStatement` dan `createPgStatement` masing-masing untuk membangun pernyataan. Misalnya, `createMySQLStatement` dapat membuat query MySQL. Fungsi-fungsi ini menerima hingga dua pernyataan, berguna ketika permintaan harus segera mengambil hasil. Dengan MySQL, Anda dapat melakukan:

```
import { sql, createMySQLStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { id, text } = ctx.args;
    const s1 = sql`insert into Post(id, text) values(${id}, ${text})`;
    const s2 = sql`select * from Post where id = ${id}`;
    return createMySQLStatement(s1, s2);
}
```

**catatan**  
`createPgStatement`dan `createMySQLStatement` tidak luput atau mengutip pernyataan yang dibangun dengan template yang `sql` diberi tag.

## Mengambil data
<a name="retrieving-data"></a>

Hasil dari pernyataan SQL Anda yang dieksekusi tersedia di handler respons Anda di objek. `context.result` Hasilnya adalah string JSON dengan [elemen respons](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html#API_ExecuteStatement_ResponseElements) dari `ExecuteStatement` tindakan. Saat diurai, hasilnya memiliki bentuk sebagai berikut:

```
type SQLStatementResults = {
    sqlStatementResults: {
        records: any[];
        columnMetadata: any[];
        numberOfRecordsUpdated: number;
        generatedFields?: any[]
    }[]
}
```

Anda dapat menggunakan `toJsonObject` utilitas untuk mengubah hasilnya menjadi daftar objek JSON yang mewakili baris yang dikembalikan. Contoh:

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

export function response(ctx) {
    const { error, result } = ctx;
    if (error) {
        return util.appendError(
            error.message,
            error.type,
            result
        )
    }
    return toJsonObject(result)[1][0]
}
```

Perhatikan bahwa `toJsonObject` mengembalikan array hasil pernyataan. Jika Anda memberikan satu pernyataan, panjang array adalah`1`. Jika Anda memberikan dua pernyataan, panjang array adalah`2`. Setiap hasil dalam array berisi `0` atau lebih baris. `toJsonObject`kembali `null` jika nilai hasil tidak valid atau tidak terduga.

## Fungsi utilitas
<a name="utility-functions"></a>

Anda dapat menggunakan pembantu utilitas modul AWS AppSync RDS untuk berinteraksi dengan database Anda.

### SQL Pilih
<a name="utility-functions-select"></a>

`select`Utilitas membuat `SELECT` pernyataan untuk query database relasional Anda. 

**Penggunaan dasar**

Dalam bentuk dasarnya, Anda dapat menentukan tabel yang ingin Anda kueri:

```
import { select, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {

    // Generates statement: 
    // "SELECT * FROM "persons"
    return createPgStatement(select({table: 'persons'}));
}
```

Perhatikan bahwa Anda juga dapat menentukan skema dalam pengidentifikasi tabel Anda:

```
import { select, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {

    // Generates statement:
    // SELECT * FROM "private"."persons"
    return createPgStatement(select({table: 'private.persons'}));
}
```

**Menentukan kolom**

Anda dapat menentukan kolom dengan `columns` properti. Jika ini tidak disetel ke nilai, defaultnya adalah: `*`

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name']
    }));
}
```

Anda dapat menentukan tabel kolom juga:

```
export function request(ctx) {

    // Generates statement: 
    // SELECT "id", "persons"."name"
    // FROM "persons"
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'persons.name']
    }));
}
```

**Batas dan offset**

Anda dapat menerapkan `limit` dan `offset` ke kueri:

```
export function request(ctx) {

    // Generates statement: 
    // SELECT "id", "name"
    // FROM "persons"
    // LIMIT :limit
    // OFFSET :offset
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        limit: 10,
        offset: 40
    }));
}
```

**Memesan oleh**

Anda dapat mengurutkan hasil Anda dengan `orderBy` properti. Menyediakan array objek yang menentukan kolom dan `dir` properti opsional:

```
export function request(ctx) {

    // Generates statement: 
    // SELECT "id", "name" FROM "persons"
    // ORDER BY "name", "id" DESC
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        orderBy: [{column: 'name'}, {column: 'id', dir: 'DESC'}]
    }));
}
```

**Filter**

Anda dapat membangun filter dengan menggunakan objek kondisi khusus:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE "name" = :NAME
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: {name: {eq: 'Stephane'}}
    }));
}
```

Anda juga dapat menggabungkan filter:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE "name" = :NAME and "id" > :ID
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: {name: {eq: 'Stephane'}, id: {gt: 10}}
    }));
}
```

Anda juga dapat membuat `OR` pernyataan:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE "name" = :NAME OR "id" > :ID
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: { or: [
            { name: { eq: 'Stephane'} },
            { id: { gt: 10 } }
        ]}
    }));
}
```

Anda juga dapat meniadakan suatu kondisi dengan`not`:

```
export function request(ctx) {

    // Generates statement:
    // SELECT "id", "name"
    // FROM "persons"
    // WHERE NOT ("name" = :NAME AND "id" > :ID)
    return createPgStatement(select({
        table: 'persons',
        columns: ['id', 'name'],
        where: { not: [
            { name: { eq: 'Stephane'} },
            { id: { gt: 10 } }
        ]}
    }));
}
```

Anda juga dapat menggunakan operator berikut untuk membandingkan nilai:


| 
| 
| Operator | Deskripsi | Jenis nilai yang mungkin | 
| --- |--- |--- |
| persamaan | Sama | nomor, string, boolean | 
| ne | Tidak sama | nomor, string, boolean | 
| le | Kurang dari atau sama | nomor, string | 
| lt | Kurang dari | nomor, string | 
| ge | Lebih besar dari atau sama | nomor, string | 
| gt | Lebih besar dari | nomor, string | 
| mengandung | Suka | string | 
| NotBerisi | Tidak suka | string | 
| Mulailah dengan | Dimulai dengan awalan | string | 
| antara | Antara dua nilai | nomor, string | 
| AttributeExists | Atribut tidak null | nomor, string, boolean | 
| ukuran | memeriksa panjang elemen | string | 

### Sisipkan SQL
<a name="utility-functions-insert"></a>

`insert`Utilitas menyediakan cara mudah untuk memasukkan item baris tunggal dalam database Anda dengan operasi. `INSERT`

**Penyisipan item tunggal**

Untuk menyisipkan item, tentukan tabel dan kemudian masukkan objek nilai Anda. Kunci objek dipetakan ke kolom tabel Anda. Nama kolom secara otomatis lolos, dan nilai dikirim ke database menggunakan peta variabel:

```
import { insert, createMySQLStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: values } = ctx.args;
    const insertStatement = insert({ table: 'persons', values });
    
    // Generates statement:
    // INSERT INTO `persons`(`name`)
    // VALUES(:NAME)
    return createMySQLStatement(insertStatement)
}
```

**Kasus penggunaan MySQL**

Anda dapat menggabungkan `insert` diikuti oleh a `select` untuk mengambil baris yang disisipkan:

```
import { insert, select, createMySQLStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: values } = ctx.args;
    const insertStatement = insert({  table: 'persons', values });
    const selectStatement = select({
        table: 'persons',
        columns: '*',
        where: { id: { eq: values.id } },
        limit: 1,
    });
    
    // Generates statement:
    // INSERT INTO `persons`(`name`)
    // VALUES(:NAME)
    // and
    // SELECT *
    // FROM `persons`
    // WHERE `id` = :ID
    return createMySQLStatement(insertStatement, selectStatement)
}
```

**Kasus penggunaan postgres**

Dengan Postgres, Anda dapat menggunakan [https://www.postgresql.org/docs/current/dml-returning.html](https://www.postgresql.org/docs/current/dml-returning.html)untuk mendapatkan data dari baris yang Anda masukkan. Ia menerima `*` atau array nama kolom:

```
import { insert, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: values } = ctx.args;
    const insertStatement = insert({
        table: 'persons',
        values,
        returning: '*'
    });

    // Generates statement:
    // INSERT INTO "persons"("name")
    // VALUES(:NAME)
    // RETURNING *
    return createPgStatement(insertStatement)
}
```

### Pembaruan SQL
<a name="utility-functions-update"></a>

`update`Utilitas memungkinkan Anda untuk memperbarui baris yang ada. Anda dapat menggunakan objek kondisi untuk menerapkan perubahan pada kolom yang ditentukan di semua baris yang memenuhi kondisi. Sebagai contoh, katakanlah kita memiliki skema yang memungkinkan kita membuat mutasi ini. Kami ingin memperbarui `name` of `Person` dengan `id` nilai `3` tetapi hanya jika kami mengetahuinya (`known_since`) sejak tahun ini`2000`:

```
mutation Update {
    updatePerson(
        input: {id: 3, name: "Jon"},
        condition: {known_since: {ge: "2000"}}
    ) {
    id
    name
  }
}
```

Penyelesai pembaruan kami terlihat seperti ini:

```
import { update, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: { id, ...values }, condition } = ctx.args;
    const where = {
        ...condition,
        id: { eq: id },
    };
    const updateStatement = update({
        table: 'persons',
        values,
        where,
        returning: ['id', 'name'],
    });

    // Generates statement:
    // UPDATE "persons"
    // SET "name" = :NAME, "birthday" = :BDAY, "country" = :COUNTRY
    // WHERE "id" = :ID
    // RETURNING "id", "name"
    return createPgStatement(updateStatement)
}
```

Kita dapat menambahkan cek ke kondisi kita untuk memastikan bahwa hanya baris yang memiliki kunci utama `id` sama dengan `3` diperbarui. Demikian pula, untuk Postgres`inserts`, Anda dapat menggunakan `returning` untuk mengembalikan data yang dimodifikasi. 

### SQL Hapus
<a name="utility-functions-delete"></a>

`remove`Utilitas memungkinkan Anda untuk menghapus baris yang ada. Anda dapat menggunakan objek kondisi pada semua baris yang memenuhi kondisi. Perhatikan bahwa itu `delete` adalah kata kunci yang dicadangkan di JavaScript. `remove`harus digunakan sebagai gantinya:

```
import { remove, createPgStatement } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const { input: { id }, condition } = ctx.args;
    const where = { ...condition, id: { eq: id } };
    const deleteStatement = remove({
        table: 'persons',
        where,
        returning: ['id', 'name'],
    });

    // Generates statement:
    // DELETE "persons"
    // WHERE "id" = :ID
    // RETURNING "id", "name"
    return createPgStatement(updateStatement)
}
```

## Casting
<a name="casting"></a>

Dalam beberapa kasus, Anda mungkin ingin lebih spesifisitas tentang jenis objek yang benar untuk digunakan dalam pernyataan Anda. Anda dapat menggunakan petunjuk jenis yang disediakan untuk menentukan jenis parameter Anda. AWS AppSync mendukung [petunjuk jenis yang sama](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html#rdsdtataservice-Type-SqlParameter-typeHint) dengan Data API. Anda dapat mentransmisikan parameter Anda dengan menggunakan `typeHint` fungsi dari AWS AppSync `rds` modul. 

Contoh berikut memungkinkan Anda untuk mengirim array sebagai nilai yang dicor sebagai objek JSON. Kami menggunakan `->` operator untuk mengambil elemen di `index` `2` dalam array JSON:

```
import { sql, createPgStatement, toJsonObject, typeHint } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const arr = ctx.args.list_of_ids
    const statement = sql`select ${typeHint.JSON(arr)}->2 as value`
    return createPgStatement(statement)
}

export function response(ctx) {
    return toJsonObject(ctx.result)[0][0].value
}
```

Casting juga berguna saat menangani dan membandingkan`DATE`,`TIME`, dan`TIMESTAMP`:

```
import { select, createPgStatement, typeHint } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const when = ctx.args.when
    const statement = select({
        table: 'persons',
        where: { createdAt : { gt: typeHint.DATETIME(when) } }
    })
    return createPgStatement(statement)
}
```

Berikut contoh lain yang menunjukkan bagaimana Anda dapat mengirim tanggal dan waktu saat ini:

```
import { sql, createPgStatement, typeHint } from '@aws-appsync/utils/rds';

export function request(ctx) {
    const now = util.time.nowFormatted('YYYY-MM-dd HH:mm:ss')
    return createPgStatement(sql`select ${typeHint.TIMESTAMP(now)}`)
}
```

**Petunjuk tipe yang tersedia**
+ `typeHint.DATE`- Parameter yang sesuai dikirim sebagai objek `DATE` tipe ke database. Format yang diterima adalah `YYYY-MM-DD`.
+ `typeHint.DECIMAL`- Parameter yang sesuai dikirim sebagai objek `DECIMAL` tipe ke database.
+ `typeHint.JSON`- Parameter yang sesuai dikirim sebagai objek `JSON` tipe ke database.
+ `typeHint.TIME`- Nilai parameter string yang sesuai dikirim sebagai objek dari `TIME` tipe ke database. Format yang diterima adalah `HH:MM:SS[.FFF]`. 
+ `typeHint.TIMESTAMP`- Nilai parameter string yang sesuai dikirim sebagai objek dari `TIMESTAMP` tipe ke database. Format yang diterima adalah `YYYY-MM-DD HH:MM:SS[.FFF]`.
+ `typeHint.UUID`- Nilai parameter string yang sesuai dikirim sebagai objek dari `UUID` tipe ke database.

# AWS AppSync JavaScript resolver dan referensi fungsi untuk runtime Amazon Bedrock
<a name="resolver-reference-bedrock-js"></a>

Anda dapat menggunakan AWS AppSync fungsi dan resolver untuk memanggil model di Amazon Bedrock di situs Anda. Akun AWS Anda dapat membentuk payload permintaan dan respons dari fungsi pemanggilan model Anda sebelum mengembalikannya ke klien Anda. Anda dapat menggunakan API runtime Amazon Bedrock atau `InvokeModel` API. `Converse` Bagian ini menjelaskan permintaan untuk operasi Amazon Bedrock yang didukung.

**catatan**  
AWS AppSync hanya mendukung pemanggilan sinkron yang selesai dalam 10 detik. Tidak mungkin untuk memanggil aliran APIs Amazon Bedrock. AWS AppSync hanya mendukung pemanggilan model fondasi dan [profil inferensi](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles.html) di wilayah yang sama dengan API. AWS AppSync 

## Permintaan objek
<a name="request_object"></a>

Objek `InvokeModel` permintaan memungkinkan Anda berinteraksi dengan `InvokeModel` API Amazon Bedrock.

```
type BedrockInvokeModelRequest = {
  operation: 'InvokeModel';
  modelId: string;
  body: any;
  guardrailIdentifier?: string;
  guardrailVersion?: string;
  guardrailTrace?: string;
}
```

Objek `Converse` permintaan memungkinkan Anda berinteraksi dengan `Converse` API Amazon Bedrock.

```
type BedrockConverseRequest = {
  operation: 'Converse';
  modelId: string;
  messages: BedrockMessage[];
  additionalModelRequestFields?: any;
  additionalModelResponseFieldPaths?: string[];
  guardrailConfig?: BedrockGuardrailConfig;
  inferenceConfig?: BedrockInferenceConfig;
  promptVariables?: { [key: string]: BedrockPromptVariableValues }[];
  system?: BedrockSystemContent[];
  toolConfig?: BedrockToolConfig;
}
```

Lihat [Jenis referensi](#type-reference-bedrock) bagian nanti dalam topik ini untuk lebih jelasnya.

Dari fungsi dan resolver, Anda dapat membuat objek permintaan secara langsung atau menggunakan fungsi helper dari @aws - appsync/utils/ai untuk membuat permintaan. Saat menentukan Id model (modelID) dalam permintaan Anda, Anda dapat menggunakan Id model atau model ARN.

Contoh berikut menggunakan `invokeModel` fungsi untuk meringkas teks menggunakan Amazon Titan Text G1 - Lite (amazon. titan-text-lite-v1). Pagar pembatas yang dikonfigurasi digunakan untuk mengidentifikasi dan memblokir atau memfilter konten yang tidak diinginkan dalam aliran prompt. Pelajari selengkapnya tentang [Amazon Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) di Panduan Pengguna *Amazon Bedrock*.

**penting**  
Anda bertanggung jawab untuk pengembangan aplikasi yang aman dan mencegah kerentanan, seperti injeksi cepat. Untuk mempelajari selengkapnya, lihat [Keamanan injeksi cepat](https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-injection.html) di *Panduan Pengguna Amazon Bedrock*.

```
import { invokeModel } from '@aws-appsync/utils/ai'
export function request(ctx) {
  return invokeModel({
    modelId: 'amazon.titan-text-lite-v1',
    guardrailIdentifier: "zabcd12345678",
    guardrailVersion: "1",
    body: { inputText: `Summarize this text in less than 100 words. : \n<text>${ctx.stash.text ?? ctx.env.DEFAULT_TEXT}</text>` },
  })
}

export function response(ctx) {
  return ctx.result.results[0].outputText
}
```

Contoh berikut menggunakan `converse` fungsi dengan profil inferensi lintas wilayah (us.anthropic.claude-3-5-haiku-20241022-v 1:0). *Pelajari selengkapnya tentang [Prasyarat Amazon Bedrock untuk profil inferensi](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-prereq.html) di Panduan Pengguna Amazon Bedrock*

**Pengingat**: Anda bertanggung jawab untuk pengembangan aplikasi yang aman dan mencegah kerentanan, seperti injeksi cepat.

```
import { converse } from '@aws-appsync/utils/ai'

export function request(ctx) {
  return converse({
    modelId: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',
    system: [
      {
        text: `
You are a database assistant that provides SQL queries to retrieve data based on a natural language request. 
${ctx.args.explain ? 'Explain your answer' : 'Do not explain your answer'}.
Assume a database with the following tables and columns exists:

Customers:  
- customer_id (INT, PRIMARY KEY)  
- first_name (VARCHAR)  
- last_name (VARCHAR)  
- email (VARCHAR)  
- phone (VARCHAR)  
- address (VARCHAR)  
- city (VARCHAR)  
- state (VARCHAR)  
- zip_code (VARCHAR)  
  
Products:  
- product_id (INT, PRIMARY KEY)  
- product_name (VARCHAR)  
- description (TEXT)  
- category (VARCHAR)  
- price (DECIMAL)  
- stock_quantity (INT)  

Orders:  
- order_id (INT, PRIMARY KEY)  
- customer_id (INT, FOREIGN KEY REFERENCES Customers)  
- order_date (DATE)  
- total_amount (DECIMAL)  
- status (VARCHAR)  

Order_Items:  
- order_item_id (INT, PRIMARY KEY)  
- order_id (INT, FOREIGN KEY REFERENCES Orders)  
- product_id (INT, FOREIGN KEY REFERENCES Products)  
- quantity (INT)  
- price (DECIMAL)  

Reviews:  
- review_id (INT, PRIMARY KEY)  
- product_id (INT, FOREIGN KEY REFERENCES Products)  
- customer_id (INT, FOREIGN KEY REFERENCES Customers)  
- rating (INT)  
- comment (TEXT)  
- review_date (DATE)`,
      },
    ],
    messages: [
      {
        role: 'user',
        content: [{ text: `<request>${ctx.args.text}:</request>` }],
      },
    ],
  })
}

export function response(ctx) {
  return ctx.result.output.message.content[0].text
}
```

Contoh berikut digunakan `converse` untuk membuat respon terstruktur. Perhatikan bahwa kami menggunakan variabel lingkungan untuk referensi skema DB kami dan kami mengonfigurasi pagar pembatas untuk membantu mencegah serangan.

```
import { converse } from '@aws-appsync/utils/ai'

export function request(ctx) {
  return generateObject({
    modelId: ctx.env.HAIKU3_5, // keep the model in an env variable
    prompt: ctx.args.query,
    shape: objectType(
      {
        sql: stringType('the sql query to execute as a javascript template string.'),
        parameters: objectType({}, 'the placeholder parameters for the query, if any.'),
      },
      'the sql query to execute along with the place holder parameters',
    ),
    system: [
      {
        text: `
You are a database assistant that provides SQL queries to retrieve data based on a natural language request. 

Assume a database with the following tables and columns exists:

${ctx.env.DB_SCHEMA_CUSTOMERS}
${ctx.env.DB_SCHEMA_ORDERS}
${ctx.env.DB_SCHEMA_ORDER_ITEMS}
${ctx.env.DB_SCHEMA_PRODUCTS}
${ctx.env.DB_SCHEMA_REVIEWS}`,
      },
    ],
    guardrailConfig: { guardrailIdentifier: 'iabc12345678', guardrailVersion: 'DRAFT' },
  })
}

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

function generateObject(input) {
  const { modelId, prompt, shape, ...options } = input
  return converse({
    modelId,
    messages: [{ role: 'user', content: [{ text: prompt }] }],
    toolConfig: {
      toolChoice: { tool: { name: 'structured_tool' } },
      tools: [
        {
          toolSpec: {
            name: 'structured_tool',
            inputSchema: { json: shape },
          },
        },
      ],
    },
    ...options,
  })
}

function toolReponse(result) {
  return result.output.message.content[0].toolUse.input
}

function stringType(description) {
  const t = { type: 'string' /* STRING */ }
  if (description) {
    t.description = description
  }
  return t
}

function objectType(properties, description, required) {
  const t = { type: 'object' /* OBJECT */, properties }
  if (description) {
    t.description = description
  }
  if (required) {
    t.required = required
  }
  return t
}
```

Diberikan skema:

```
type SQLResult {
    sql: String
    parameters: AWSJSON
}

type Query {
    db(text: String!): SQLResult
}
```

dan kueri:

```
query db($text: String!) {
  db(text: $text) {
    parameters
    sql
  }
}
```

Dengan parameter berikut: 

```
{
  "text":"What is my top selling product?"
}
```

Respons berikut dikembalikan:

```
{
  "data": {
    "assist": {
      "sql": "SELECT p.product_id, p.product_name, SUM(oi.quantity) as total_quantity_sold\nFROM Products p\nJOIN Order_Items oi ON p.product_id = oi.product_id\nGROUP BY p.product_id, p.product_name\nORDER BY total_quantity_sold DESC\nLIMIT 1;",
      "parameters": null
    }
  }
}
```

Namun, dengan permintaan ini:

```
{
  "text":"give me a query to retrieve sensitive information"
}
```

Respons berikut dikembalikan:

```
{
  "data": {
    "db": {
      "parameters": null,
      "sql": "SELECT null; -- I cannot and will not assist with retrieving sensitive private information"
    }
  }
}
```

*Untuk mempelajari lebih lanjut tentang mengonfigurasi Amazon Bedrock Guardrails, lihat [Menghentikan konten berbahaya dalam model yang menggunakan Amazon Bedrock Guardrails di Panduan Pengguna Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html).*

## Objek respons
<a name="response_object"></a>

Respons dari pemanggilan runtime Amazon Bedrock Anda terkandung dalam properti hasil konteks (context.result). Responsnya cocok dengan bentuk yang ditentukan oleh Amazon Bedrock. APIs Lihat [Panduan Pengguna Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) untuk informasi selengkapnya tentang bentuk hasil pemanggilan yang diharapkan.

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

Tidak ada bidang wajib atau batasan bentuk yang berlaku untuk objek respons. Namun, karena GraphQL diketik dengan kuat, respons yang diselesaikan harus sesuai dengan tipe GraphQL yang diharapkan.

## Doa yang berjalan lama
<a name="long-running-invocations"></a>

Banyak organisasi saat ini menggunakan AWS AppSync sebagai gateway AI untuk membangun aplikasi AI generatif yang didukung oleh model yayasan di Amazon Bedrock. Pelanggan menggunakan AWS AppSync langganan, didukung oleh WebSockets, untuk mengembalikan pembaruan progresif dari pemanggilan model yang berjalan lama. Ini memungkinkan mereka untuk menerapkan pola asinkron.

Diagram berikut menunjukkan bagaimana Anda dapat menerapkan pola ini. Dalam diagram, langkah-langkah berikut terjadi.

1. Klien Anda memulai langganan, yang menyiapkan WebSocket, dan membuat permintaan AWS AppSync untuk memicu pemanggilan AI Generatif.

1. AWS AppSync memanggil AWS Lambda fungsi Anda dalam mode Peristiwa dan segera mengembalikan respons ke klien.

1. Fungsi Lambda Anda memanggil model di Amazon Bedrock. Fungsi Lambda dapat menggunakan API sinkron, seperti`InvokeModel`, atau API aliran, seperti`InvokeModelWithResponseStream`, untuk mendapatkan pembaruan progresif.

1. Saat pembaruan diterima, atau saat pemanggilan selesai, fungsi Lambda mengirimkan pembaruan melalui mutasi ke API Anda yang memicu langganan. AWS AppSync 

1. Acara berlangganan dikirim secara real-time dan diterima oleh klien Anda melalui WebSocket.

![\[Diagram yang menunjukkan alur kerja untuk menggunakan AWS AppSync langganan untuk mengembalikan pembaruan dari model Amazon Bedrock.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/bedrock-workflow.png)


## Jenis referensi
<a name="type-reference-bedrock"></a>

```
export type BedrockMessage = {
  role: 'user' | 'assistant' | string;
  content: BedrockMessageContent[];
};

export type BedrockMessageContent =
  | { text: string }
  | { guardContent: BedrockGuardContent }
  | { toolResult: BedrockToolResult }
  | { toolUse: BedrockToolUse };

export type BedrockGuardContent = {
  text: BedrockGuardContentText;
};

export type BedrockGuardContentText = {
  text: string;
  qualifiers?: ('grounding_source' | 'query' | 'guard_content' | string)[];
};

export type BedrockToolResult = {
  content: BedrockToolResultContent[];
  toolUseId: string;
  status?: string;
};

export type BedrockToolResultContent = { json: any } | { text: string };

export type BedrockToolUse = {
  input: any;
  name: string;
  toolUseId: string;
};

export type ConversePayload = {
  modelId: string;
  body: any;
  guardrailIdentifier?: string;
  guardrailVersion?: string;
  guardrailTrace?: string;
};

export type BedrockGuardrailConfig = {
  guardrailIdentifier: string;
  guardrailVersion: string;
  trace: string;
};

export type BedrockInferenceConfig = {
  maxTokens?: number;
  temperature?: number;
  stopSequences?: string[];
  topP?: number;
};

export type BedrockPromptVariableValues = {
  text: string;
};

export type BedrockToolConfig = {
  tools: BedrockTool[];
  toolChoice?: BedrockToolChoice;
};

export type BedrockTool = {
  toolSpec: BedrockToolSpec;
};

export type BedrockToolSpec = {
  name: string;
  description?: string;
  inputSchema: BedrockInputSchema;
};

export type BedrockInputSchema = {
  json: any;
};

export type BedrockToolChoice =
  | { tool: BedrockSpecificToolChoice }
  | { auto: any }
  | { any: any };

export type BedrockSpecificToolChoice = {
  name: string;
};

export type BedrockSystemContent =
  | { guardContent: BedrockGuardContent }
  | { text: string };

export type BedrockConverseOutput = {
  message?: BedrockMessage;
};

export type BedrockConverseMetrics = {
  latencyMs: number;
};

export type BedrockTokenUsage = {
  inputTokens: number;
  outputTokens: number;
  totalTokens: number;
};

export type BedrockConverseTrace = {
  guardrail?: BedrockGuardrailTraceAsssessment;
};

export type BedrockGuardrailTraceAsssessment = {
  inputAssessment?: { [key: string]: BedrockGuardrailAssessment };
  modelOutput?: string[];
  outputAssessments?: { [key: string]: BedrockGuardrailAssessment };
};

export type BedrockGuardrailAssessment = {
  contentPolicy?: BedrockGuardrailContentPolicyAssessment;
  contextualGroundingPolicy?: BedrockGuardrailContextualGroundingPolicyAssessment;
  invocationMetrics?: BedrockGuardrailInvocationMetrics;
  sensitiveInformationPolicy?: BedrockGuardrailSensitiveInformationPolicyAssessment;
  topicPolicy?: BedrockGuardrailTopicPolicyAssessment;
  wordPolicy?: BedrockGuardrailWordPolicyAssessment;
};

export type BedrockGuardrailContentPolicyAssessment = {
  filters: BedrockGuardrailContentFilter[];
};

export type BedrockGuardrailContentFilter = {
  action: 'BLOCKED' | string;
  confidence: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | string;
  type:
    | 'INSULTS'
    | 'HATE'
    | 'SEXUAL'
    | 'VIOLENCE'
    | 'MISCONDUCT'
    | 'PROMPT_ATTACK'
    | string;
  filterStrength: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | string;
};

export type BedrockGuardrailContextualGroundingPolicyAssessment = {
  filters: BedrockGuardrailContextualGroundingFilter;
};

export type BedrockGuardrailContextualGroundingFilter = {
  action: 'BLOCKED' | 'NONE' | string;
  score: number;
  threshold: number;
  type: 'GROUNDING' | 'RELEVANCE' | string;
};

export type BedrockGuardrailInvocationMetrics = {
  guardrailCoverage?: BedrockGuardrailCoverage;
  guardrailProcessingLatency?: number;
  usage?: BedrockGuardrailUsage;
};

export type BedrockGuardrailCoverage = {
  textCharacters?: BedrockGuardrailTextCharactersCoverage;
};

export type BedrockGuardrailTextCharactersCoverage = {
  guarded?: number;
  total?: number;
};

export type BedrockGuardrailUsage = {
  contentPolicyUnits: number;
  contextualGroundingPolicyUnits: number;
  sensitiveInformationPolicyFreeUnits: number;
  sensitiveInformationPolicyUnits: number;
  topicPolicyUnits: number;
  wordPolicyUnits: number;
};

export type BedrockGuardrailSensitiveInformationPolicyAssessment = {
  piiEntities: BedrockGuardrailPiiEntityFilter[];
  regexes: BedrockGuardrailRegexFilter[];
};

export type BedrockGuardrailPiiEntityFilter = {
  action: 'BLOCKED' | 'ANONYMIZED' | string;
  match: string;
  type:
    | 'ADDRESS'
    | 'AGE'
    | 'AWS_ACCESS_KEY'
    | 'AWS_SECRET_KEY'
    | 'CA_HEALTH_NUMBER'
    | 'CA_SOCIAL_INSURANCE_NUMBER'
    | 'CREDIT_DEBIT_CARD_CVV'
    | 'CREDIT_DEBIT_CARD_EXPIRY'
    | 'CREDIT_DEBIT_CARD_NUMBER'
    | 'DRIVER_ID'
    | 'EMAIL'
    | 'INTERNATIONAL_BANK_ACCOUNT_NUMBER'
    | 'IP_ADDRESS'
    | 'LICENSE_PLATE'
    | 'MAC_ADDRESS'
    | 'NAME'
    | 'PASSWORD'
    | 'PHONE'
    | 'PIN'
    | 'SWIFT_CODE'
    | 'UK_NATIONAL_HEALTH_SERVICE_NUMBER'
    | 'UK_NATIONAL_INSURANCE_NUMBER'
    | 'UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER'
    | 'URL'
    | 'USERNAME'
    | 'US_BANK_ACCOUNT_NUMBER'
    | 'US_BANK_ROUTING_NUMBER'
    | 'US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER'
    | 'US_PASSPORT_NUMBER'
    | 'US_SOCIAL_SECURITY_NUMBER'
    | 'VEHICLE_IDENTIFICATION_NUMBER'
    | string;
};

export type BedrockGuardrailRegexFilter = {
  action: 'BLOCKED' | 'ANONYMIZED' | string;
  match?: string;
  name?: string;
  regex?: string;
};

export type BedrockGuardrailTopicPolicyAssessment = {
  topics: BedrockGuardrailTopic[];
};

export type BedrockGuardrailTopic = {
  action: 'BLOCKED' | string;
  name: string;
  type: 'DENY' | string;
};

export type BedrockGuardrailWordPolicyAssessment = {
  customWords: BedrockGuardrailCustomWord[];
  managedWordLists: BedrockGuardrailManagedWord[];
};

export type BedrockGuardrailCustomWord = {
  action: 'BLOCKED' | string;
  match: string;
};

export type BedrockGuardrailManagedWord = {
  action: 'BLOCKED' | string;
  match: string;
  type: 'PROFANITY' | string;
};
```