

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

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