

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

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

Die folgenden Abschnitte enthalten die `APPSYNC_JS` Laufzeit- und JavaScript Resolver-Referenz:
+  [ JavaScriptÜbersicht über Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html) — Erfahren Sie mehr über die Funktionsweise von Resolvern in. AWS AppSync
+  [Objektreferenz für den Resolver-Kontext](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) — Erfahren Sie mehr über das Kontextobjekt und seine Verwendung in Resolvern.
+  [ JavaScript Laufzeitfunktionen für Resolver und Funktionen](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) — Erfahren Sie mehr über unterstützte Runtime-Funktionen und die Verwendung von Hilfsprogrammen zur Codevereinfachung.
+  [ JavaScriptResolver-Funktionsreferenz für DynamoDB](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html) — Erfahren Sie mehr darüber, wie Resolver mit DynamoDB interagieren.
+  [ JavaScriptReferenz zur Resolver-Funktion für OpenSearch ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-elasticsearch-js.html) — Erfahren Sie mehr über die Struktur von Anfragen und Antworten auf Resolver sowie über Interaktionen mit dem Service. OpenSearch 
+  [ JavaScript Resolver-Funktionsreferenz für Lambda](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-lambda-js.html) — Erfahren Sie mehr über die Resolver-Anfrage- und Antwortstruktur und Interaktionen mit Lambda.
+  [ JavaScriptResolver-Funktionsreferenz für die EventBridge Datenquelle](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-eventbridge-js.html) — Erfahren Sie mehr über die Resolver-Anfrage- und Antwortstruktur und Interaktionen mit. EventBridge
+  [ JavaScript Referenz zur Resolverfunktion für die Datenquelle None](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-none-js.html) — Erfahren Sie mehr über die Anforderungs- und Antwortstruktur des Resolvers sowie über Interaktionen mit NONE-Datenquellen.
+  [ JavaScript Resolver-Funktionsreferenz für HTTP](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-http-js.html) — Erfahren Sie mehr über die Resolver-Anforderungs- und Antwortstruktur und Interaktionen mit HTTP-Endpunkten.
+  [ JavaScript Resolver-Funktionsreferenz für Amazon RDS](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-rds-js.html) — Erfahren Sie mehr über die Resolver-Struktur und Interaktionen mit RDS.
+  [ JavaScript Resolver-Funktionsreferenz für Amazon Bedrock](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-bedrock-js.html) — Erfahren Sie mehr über die Resolver-Struktur und Interaktionen mit Amazon Bedrock.

# AWS AppSync JavaScript Übersicht über Resolver
<a name="resolver-reference-overview-js"></a>

AWS AppSync ermöglicht es Ihnen, auf GraphQL-Anfragen zu antworten, indem Sie Operationen an Ihren Datenquellen ausführen. Für jedes GraphQL-Feld, für das Sie eine Abfrage, Mutation oder ein Abonnement ausführen möchten, muss ein Resolver angehängt werden.

Resolver sind die Verbindungen zwischen GraphQL und einer Datenquelle. Sie erklären, AWS AppSync wie Sie eine eingehende GraphQL-Anfrage in Anweisungen für Ihre Backend-Datenquelle übersetzen und wie Sie die Antwort von dieser Datenquelle zurück in eine GraphQL-Antwort übersetzen. Mit AWS AppSync können Sie Ihre Resolver in der () -Umgebung schreiben JavaScript und ausführen. AWS AppSync `APPSYNC_JS` 

AWS AppSync ermöglicht es Ihnen, Unit-Resolver oder Pipeline-Resolver zu schreiben, die aus mehreren AWS AppSync Funktionen in einer Pipeline bestehen.

## Unterstützte Laufzeitfunktionen
<a name="runtime-support-js"></a>

Die AWS AppSync JavaScript Runtime bietet eine Teilmenge von JavaScript Bibliotheken, Dienstprogrammen und Funktionen. Eine vollständige Liste der Features und Funktionen, die von der Runtime unterstützt werden, finden Sie unter `APPSYNC_JS` [JavaScript Runtime-Features für Resolver und](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) Funktionen.

## Resolver für Einheiten
<a name="unit-resolver-js"></a>

Ein Unit-Resolver besteht aus Code, der einen Anforderungs- und Antworthandler definiert, die für eine Datenquelle ausgeführt werden. Der Anforderungshandler verwendet ein Kontextobjekt als Argument und gibt die Anforderungsnutzdaten zurück, die zum Aufrufen Ihrer Datenquelle verwendet wurden. Der Antworthandler erhält von der Datenquelle eine Nutzlast mit dem Ergebnis der ausgeführten Anfrage zurück. Der Response-Handler wandelt die Nutzlast in eine GraphQL-Antwort um, um das GraphQL-Feld aufzulösen. Im folgenden Beispiel ruft ein Resolver ein Element aus einer DynamoDB-Datenquelle ab:

```
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;
```

## Aufbau eines Pipeline-Resolvers JavaScript
<a name="anatomy-of-a-pipeline-resolver-js"></a>

Ein Pipeline-Resolver besteht aus Code, der einen Anfrage- und Antworthandler sowie eine Liste von Funktionen definiert. Jede Funktion hat einen **Anforderungs** - und **Antworthandler**, den sie für eine Datenquelle ausführt. Da ein Pipeline-Resolver Läufe an eine Liste von Funktionen delegiert, ist er daher mit keiner Datenquelle verknüpft. Unit-Resolver und -Funktionen sind Primitive, die Operation auf Datenquellen auszuführen.

### Anforderungshandler für Pipeline-Resolver
<a name="request-handler-js"></a>

Der Anforderungshandler eines Pipeline-Resolvers (der vorherige Schritt) ermöglicht es Ihnen, einige Vorbereitungslogik durchzuführen, bevor Sie die definierten Funktionen ausführen.

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

Die Liste der Funktionen eines Pipeline-Resolvers wird nacheinander ausgeführt. Das Ergebnis der Auswertung des Pipeline-Resolver-Request-Handlers wird der ersten Funktion als zur Verfügung gestellt. `ctx.prev.result` Jedes Ergebnis der Funktionsauswertung steht der nächsten Funktion als `ctx.prev.result` zur Verfügung.

### Antworthandler für den Pipeline-Resolver
<a name="response-handler-js"></a>

Der Response-Handler eines Pipeline-Resolvers ermöglicht es Ihnen, einige letzte Logik von der Ausgabe der letzten Funktion bis zum erwarteten GraphQL-Feldtyp auszuführen. Die Ausgabe der letzten Funktion in der Funktionsliste ist im Response-Handler des Pipeline-Resolvers als oder verfügbar. `ctx.prev.result` `ctx.result`

### Ablauf der Ausführung
<a name="execution-flow-js"></a>

Bei einem Pipeline-Resolver, der aus zwei Funktionen besteht, stellt die folgende Liste den Ausführungsablauf dar, wenn der Resolver aufgerufen wird:

1.  Anforderungshandler für Pipeline-Resolver

1.  Funktion 1: Funktionsanforderungshandler 

1.  Funktion 1: Aufruf der Datenquelle 

1.  Funktion 1: Funktionsantwort-Handler 

1.  Funktion 2: Funktionsanforderungshandler 

1.  Funktion 2: Aufruf der Datenquelle 

1.  Funktion 2: Funktionsantwort-Handler 

1.  Antworthandler für den Pipeline-Resolver 

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


### Nützliche integrierte `APPSYNC_JS` Runtime-Dienstprogramme
<a name="useful-utilities-js"></a>

Die folgenden Dienstprogramme unterstützen die Arbeit mit Pipeline-Resolvern.

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

Der Stash ist ein Objekt, das in jedem Resolver und jedem Funktionsanforderungs- und Antworthandler zur Verfügung gestellt wird. Dieselbe Stash-Instanz durchläuft einen einzigen Resolver-Lauf. Das bedeutet, dass Sie den Stash verwenden können, um beliebige Daten zwischen Anfrage- und Antworthandlern und zwischen Funktionen in einem Pipeline-Resolver zu übergeben. Sie können den Stash wie ein normales Objekt testen. JavaScript 

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

`ctx.prev.result` ist das Ergebnis der vorherigen Operation, die in der Pipeline ausgeführt wurde. Wenn es sich bei der vorherigen Operation um den Anforderungshandler für den Pipeline-Resolver handelte, `ctx.prev.result` wird er der ersten Funktion in der Kette zur Verfügung gestellt. Wenn die vorherige Operation die erste Funktion betraf, steht `ctx.prev.result` für die Ausgabe der ersten Funktion und wird der zweiten Funktion in der Pipeline zur Verfügung gestellt. Wenn die vorherige Operation die letzte Funktion war, stellt sie die Ausgabe der letzten Funktion `ctx.prev.result` dar und wird dem Response-Handler des Pipeline-Resolvers zur Verfügung gestellt.

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

Das Dienstprogramm `util.error` ist nützlich, um ein Feldfehler auszulösen. Die Verwendung `util.error` innerhalb eines Funktionsanforderungs- oder Antworthandlers löst sofort einen Feldfehler aus, der verhindert, dass nachfolgende Funktionen ausgeführt werden. Weitere Informationen und andere `util.error` Signaturen finden Sie unter [JavaScriptLaufzeitfunktionen für Resolver und](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) Funktionen.

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

`util.appendError`ist ähnlich wie`util.error()`, mit dem großen Unterschied, dass es die Auswertung des Handlers nicht unterbricht. Stattdessen signalisiert es, dass ein Fehler mit dem Feld aufgetreten ist, ermöglicht aber die Auswertung des Handlers und damit die Rückgabe von Daten. Die Verwendung von `util.appendError` in einer Funktion hat keine Auswirkungen auf die Ausführung des Pipeline-Ablaufs. Weitere Informationen und andere `util.error` Signaturen finden Sie in den [JavaScript Laufzeitfunktionen für Resolver und Funktionen](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html).

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

Mit dieser `runtime.earlyReturn` Funktion können Sie von jeder Anforderungsfunktion vorzeitig zurückkehren. Wenn Sie den Request-Handler `runtime.earlyReturn` innerhalb eines Resolvers verwenden, wird er vom Resolver zurückgegeben. Wenn Sie ihn von einem AWS AppSync Funktionsanforderungshandler aus aufrufen, kehren Sie von der Funktion zurück und setzen die Ausführung entweder mit der nächsten Funktion in der Pipeline oder dem Resolver-Response-Handler fort.

### Pipeline-Resolver schreiben
<a name="writing-resolvers"></a>

Ein Pipeline-Resolver hat außerdem einen Request- und einen Response-Handler, der die Ausführung der Funktionen in der Pipeline umgibt: Sein Request-Handler wird vor der Anfrage der ersten Funktion ausgeführt, und sein Response-Handler wird nach der Antwort der letzten Funktion ausgeführt. Der Resolver-Anforderungshandler kann Daten so einrichten, dass sie von Funktionen in der Pipeline verwendet werden. Der Resolver-Response-Handler ist für die Rückgabe von Daten verantwortlich, die dem GraphQL-Feldausgabetyp zugeordnet sind. Im folgenden Beispiel definiert ein Resolver-Request-Handler`allowedGroups`; die zurückgegebenen Daten sollten zu einer dieser Gruppen gehören. Dieser Wert kann von den Funktionen des Resolvers verwendet werden, um Daten anzufordern. Der Response-Handler des Resolvers führt eine letzte Prüfung durch und filtert das Ergebnis, um sicherzustellen, dass nur Elemente zurückgegeben werden, die zu den zulässigen Gruppen gehören.

```
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;
}
```

#### Funktionen schreiben AWS AppSync
<a name="writing-functions"></a>

AWS AppSync Funktionen ermöglichen es Ihnen, allgemeine Logik zu schreiben, die Sie für mehrere Resolver in Ihrem Schema wiederverwenden können. Sie können beispielsweise eine AWS AppSync Funktion aufrufen, die für `QUERY_ITEMS` die Abfrage von Elementen aus einer Amazon DynamoDB DynamoDB-Datenquelle zuständig ist. Für Resolver, mit denen Sie Elemente abfragen möchten, fügen Sie die Funktion einfach zur Pipeline des Resolvers hinzu und geben Sie den zu verwendenden Abfrageindex an. Die Logik muss nicht erneut implementiert werden.

## Zusätzliche Themen
<a name="supplemental-topics"></a>

**Topics**
+ [Beispiel für einen Pipeline-Resolver mit Amazon DynamoDB](https://docs.aws.amazon.com/appsync/latest/devguide/writing-code.html)
+ [Konfiguration von Dienstprogrammen für die Laufzeit `APPSYNC_JS`](https://docs.aws.amazon.com/appsync/latest/devguide/utility-resolvers.html)
+ [Bündelung TypeScript und Quellzuordnungen für die Runtime `APPSYNC_JS`](https://docs.aws.amazon.com/appsync/latest/devguide/additional-utilities.html)
+ [Testen Sie Ihren Resolver und Ihre Funktionshandler](https://docs.aws.amazon.com/appsync/latest/devguide/test-resolvers.html)
+ [Migration von VTL zu JavaScript](https://docs.aws.amazon.com/appsync/latest/devguide/migrating-resolvers.html)
+ [Wahl zwischen direktem Datenquellenzugriff und Proxying über eine Lambda-Datenquelle](https://docs.aws.amazon.com/appsync/latest/devguide/choosing-data-source.html)

# Beispiel für einen Pipeline-Resolver mit Amazon DynamoDB
<a name="writing-code"></a>

Angenommen, Sie möchten einen Pipeline-Resolver an ein Feld mit dem Namen anhängen`getPost(id:ID!)`, das einen `Post` Typ aus einer Amazon DynamoDB DynamoDB-Datenquelle mit der folgenden GraphQL-Abfrage zurückgibt:

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

Hängen Sie zunächst einen einfachen Resolver mit dem folgenden Code an`Query.getPost`. Dies ist ein Beispiel für einfachen Resolver-Code. Im Anforderungshandler ist keine Logik definiert, und der Antworthandler gibt einfach das Ergebnis der letzten Funktion zurück.

```
/**
 * 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
}
```

Definieren Sie als Nächstes eine Funktion`GET_ITEM`, die ein Postitem aus Ihrer Datenquelle abruft:

```
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
}
```

Wenn während der Anfrage ein Fehler auftritt, hängt der Antworthandler der Funktion einen Fehler an, der in der GraphQL-Antwort an den aufrufenden Client zurückgegeben wird. Fügen Sie die `GET_ITEM` Funktion zu Ihrer Liste der Resolver-Funktionen hinzu. Wenn Sie die Abfrage ausführen, verwendet der Request-Handler der `GET_ITEM` Funktion die vom DynamoDB-Modul bereitgestellten AWS AppSync Utils, um eine `DynamoDBGetItem` Anfrage mit dem `id` als Schlüssel zu erstellen. `ddb.get({ key: { id } })`generiert die entsprechende Operation: `GetItem`

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

AWS AppSync verwendet die Anfrage, um die Daten von Amazon DynamoDB abzurufen. Sobald die Daten zurückgegeben wurden, werden sie vom Response-Handler der `GET_ITEM` Funktion verarbeitet, der nach Fehlern sucht und dann das Ergebnis zurückgibt. 

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

Schließlich gibt der Response-Handler des Resolvers das Ergebnis direkt zurück.

## Mit Fehlern arbeiten
<a name="working-with-errors"></a>

Wenn in Ihrer Funktion während einer Anfrage ein Fehler auftritt, wird der Fehler in Ihrem Funktionsantwort-Handler unter verfügbar gemacht`ctx.error`. Sie können den Fehler mit dem Hilfsprogramm an Ihre GraphQL-Antwort anhängen. `util.appendError` Sie können den Fehler mithilfe des Stash für andere Funktionen in der Pipeline verfügbar machen. Sehen Sie sich das folgende Beispiel an:

```
/**
 * 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;
}
```

# Dienstprogramme für die `APPSYNC_JS` Laufzeit konfigurieren
<a name="utility-resolvers"></a>

AWS AppSync stellt zwei Bibliotheken zur Verfügung, die bei der Entwicklung von Resolvern mit der `APPSYNC_JS` Runtime helfen: 
+ `@aws-appsync/eslint-plugin`- Erkennt und behebt Probleme während der Entwicklung schnell.
+ `@aws-appsync/utils`- Ermöglicht Typvalidierung und Autovervollständigung in Code-Editoren.

## Konfiguration des Eslint-Plugins
<a name="utility-resolvers-configuring-eslint-plugin"></a>

[ESLint](https://eslint.org/)ist ein Tool, das Ihren Code statisch analysiert, um Probleme schnell zu finden. Sie können es ESLint als Teil Ihrer kontinuierlichen Integrationspipeline ausführen. `@aws-appsync/eslint-plugin`ist ein ESLint Plugin, das bei der Nutzung der Laufzeit ungültige Syntax in Ihrem Code erkennt. `APPSYNC_JS` Das Plugin ermöglicht es Ihnen, während der Entwicklung schnell Feedback zu Ihrem Code zu erhalten, ohne Ihre Änderungen in die Cloud übertragen zu müssen.

`@aws-appsync/eslint-plugin`bietet zwei Regelsätze, die Sie während der Entwicklung verwenden können. 

**„plugin: @aws -appsync/base“** konfiguriert ein Basisregelwerk, das Sie in Ihrem Projekt nutzen können: 


| Regel | Description | 
| --- | --- | 
| nicht asynchron | Asynchrone Prozesse und Versprechen werden nicht unterstützt. | 
| kein Warten | Asynchrone Prozesse und Versprechen werden nicht unterstützt. | 
| keine Klassen | Klassen werden nicht unterstützt. | 
| nein für | forwird nicht unterstützt (außer für for-in undfor-of, die unterstützt werden) | 
| nicht weitermachen | continue wird nicht unterstützt. | 
| keine Generatoren | Generatoren werden nicht unterstützt. | 
| kein Ertrag | yield wird nicht unterstützt. | 
| keine Etiketten | Labels werden nicht unterstützt. | 
| nein, das | thisSchlüsselwort wird nicht unterstützt. | 
| versuchen Sie es nicht | Die Try/Catch-Struktur wird nicht unterstützt. | 
| keine Weile | While-Loops werden nicht unterstützt. | 
| no-disallowed-unary-operators | \$1\$1,--, und \$1 unäre Operatoren sind nicht zulässig. | 
| no-disallowed-binary-operators | Der instanceof Operator ist nicht erlaubt. | 
| kein Versprechen | Asynchrone Prozesse und Versprechen werden nicht unterstützt. | 

**„plugin: @aws -appsync/recommended“** bietet einige zusätzliche Regeln, erfordert aber auch, dass Sie Ihrem Projekt Konfigurationen hinzufügen TypeScript .


| Regel | Description | 
| --- | --- | 
| keine Rekursion | Rekursive Funktionsaufrufen sind nicht erlaubt. | 
| no-disallowed-methods | Einige Methoden sind nicht erlaubt. Eine vollständige [Liste der unterstützten integrierten Funktionen finden Sie in der Referenz](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html). | 
| no-function-passing | Das Übergeben von Funktionen als Funktionsargumente an Funktionen ist nicht zulässig. | 
| no-function-reassign | Funktionen können nicht neu zugewiesen werden. | 
| no-function-return | Funktionen können nicht der Rückgabewert von Funktionen sein. | 

Um das Plugin zu Ihrem Projekt hinzuzufügen, folgen Sie den Installations- und Nutzungsschritten unter [Erste Schritte mit ESLint](https://eslint.org/docs/latest/user-guide/getting-started#installation-and-usage). Installieren Sie dann das [Plugin](https://www.npmjs.com/package/@aws-appsync/eslint-plugin) in Ihrem Projekt mit Ihrem Projektpaketmanager (z. B. npm, yarn oder pnpm):

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

Fügen Sie in Ihrer `.eslintrc.{js,yml,json}` Datei der Eigenschaft **„plugin: @aws -appsync/base“** oder **„plugin: @aws** -appsync/recommended“ hinzu. `extends` Das folgende Snippet ist eine grundlegende Beispielkonfiguration für: `.eslintrc` JavaScript 

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

Um den Regelsatz **„plugin: @aws -appsync/recommended“** zu verwenden, installieren Sie die erforderliche Abhängigkeit:

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

Erstellen Sie dann eine Datei: `.eslintrc.js`

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

# Bündelung TypeScript, und Quellzuordnungen für die Laufzeit `APPSYNC_JS`
<a name="additional-utilities"></a>

TypeScript verbessert die AWS AppSync Entwicklung durch Typsicherheit und frühzeitige Fehlererkennung. Sie können TypeScript Code lokal schreiben und ihn transpilieren, JavaScript bevor Sie ihn mit der `APPSYNC_JS` Runtime verwenden. Der Prozess beginnt mit der Installation TypeScript und Konfiguration von tsconfig.json für die Umgebung. `APPSYNC_JS` Anschließend können Sie Bündelungstools wie esbuild verwenden, um den Code zu kompilieren und zu bündeln. Die Amplify-CLI generiert Typen aus dem GraphQL-Schema, sodass Sie diese Typen im Resolver-Code verwenden können. 

Sie können benutzerdefinierte und externe Bibliotheken in Ihrem Resolver und Funktionscode nutzen, sofern diese den Anforderungen entsprechen. `APPSYNC_JS` Bündelungstools kombinieren Code in einer einzigen Datei zur Verwendung in. AWS AppSync Quellzuordnungen können hinzugefügt werden, um das Debuggen zu erleichtern. 

## Nutzen Sie Bibliotheken und bündeln Sie Ihren Code
<a name="using-external-libraries"></a>

In Ihrem Resolver und Funktionscode können Sie sowohl benutzerdefinierte als auch externe Bibliotheken nutzen, sofern sie den Anforderungen entsprechen. `APPSYNC_JS` Dadurch ist es möglich, vorhandenen Code in Ihrer Anwendung wiederzuverwenden. Um Bibliotheken zu verwenden, die durch mehrere Dateien definiert sind, müssen Sie ein Bündelungstool wie [Esbuild](https://esbuild.github.io/) verwenden, um Ihren Code in einer einzigen Datei zu kombinieren, die dann auf Ihrem AWS AppSync Resolver oder Ihrer Funktion gespeichert werden kann.

Beachten Sie beim Bündeln Ihres Codes Folgendes:
+ `APPSYNC_JS`unterstützt nur ECMAScript Module (ESM).
+ `@aws-appsync/*`Module sind in Ihren Code integriert `APPSYNC_JS` und sollten nicht mit diesem gebündelt werden.
+ Die `APPSYNC_JS` Laufzeitumgebung ähnelt NodeJS darin, dass Code nicht in einer Browserumgebung ausgeführt wird.
+ Sie können eine optionale Quellzuordnung hinzufügen. Schließen Sie den Quellinhalt jedoch nicht ein.

  Weitere Informationen zu Quellzuordnungen finden Sie unter [Quellzuordnungen verwenden](#source-maps).

Um beispielsweise Ihren Resolver-Code unter zu bündeln`src/appsync/getPost.resolver.js`, können Sie den folgenden esbuild-CLI-Befehl verwenden:

```
$ 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
```

## Erstellen Sie Ihren Code und arbeiten Sie mit TypeScript
<a name="working-with-typescript"></a>

[TypeScript](https://www.typescriptlang.org/)ist eine von Microsoft entwickelte Programmiersprache, die alle Funktionen zusammen mit dem TypeScript Tippsystem bietet. JavaScript Sie können TypeScript damit typsicheren Code schreiben und Fehler und Bugs bei der Erstellung abfangen, bevor Sie Ihren Code unter speichern. AWS AppSync Das `@aws-appsync/utils` Paket ist vollständig typisiert.

Die `APPSYNC_JS` Runtime unterstützt nicht TypeScript direkt. Sie müssen Ihren TypeScript Code zuerst in Code transpilieren JavaScript , den die `APPSYNC_JS` Runtime unterstützt, bevor Sie Ihren Code darin AWS AppSync speichern. Sie können TypeScript damit Ihren Code in Ihrer lokalen integrierten Entwicklungsumgebung (IDE) schreiben. Beachten Sie jedoch, dass Sie in der AWS AppSync Konsole keinen TypeScript Code erstellen können.

Stellen Sie zunächst sicher, dass Sie die [TypeScript](https://www.typescriptlang.org/download)Installation in Ihrem Projekt installiert haben. Konfigurieren Sie dann Ihre Einstellungen für die TypeScript Transkompilierung so, dass sie mit der `APPSYNC_JS` Laufzeitumgebung funktionieren. [TSConfig](https://www.typescriptlang.org/tsconfig) Hier ist ein Beispiel für eine `tsconfig.json` Basisdatei, die Sie verwenden können:

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

Sie können dann ein Bündelungstool wie esbuild verwenden, um Ihren Code zu kompilieren und zu bündeln. Bei einem Projekt, in dem sich Ihr AWS AppSync Code befindet, können Sie beispielsweise den folgenden Befehl verwenden`src/appsync`, um Ihren Code zu kompilieren und zu bündeln:

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

### Verwenden von Amplify Codegen
<a name="working-with-amplify-codegen"></a>

Sie können die [Amplify CLI](https://docs.amplify.aws/cli/) verwenden, um die Typen für Ihr Schema zu generieren. Führen Sie in dem Verzeichnis, in dem sich Ihre `schema.graphql` Datei befindet, den folgenden Befehl aus und überprüfen Sie die Eingabeaufforderungen zur Konfiguration Ihres Codegens:

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

Um Ihr Codegen unter bestimmten Umständen neu zu generieren (z. B. wenn Ihr Schema aktualisiert wird), führen Sie den folgenden Befehl aus:

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

Sie können dann die generierten Typen in Ihrem Resolver-Code verwenden. Zum Beispiel anhand des folgenden Schemas:

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

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

type Query {
  listTodos: Todo
}
```

Sie könnten die generierten Typen in der folgenden AWS AppSync Beispielfunktion verwenden:

```
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
}
```

### Verwendung von Generika in TypeScript
<a name="working-with-typescript-generics"></a>

Sie können Generika mit mehreren der bereitgestellten Typen verwenden. Das folgende Snippet ist beispielsweise ein Typ: `Todo`

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

Sie können einen Resolver für ein Abonnement schreiben, das von verwendet. `Todo` In Ihrer IDE führen Sie Typdefinitionen und Hinweise zur automatischen Vervollständigung dazu, das `toSubscriptionFilter` Transform-Hilfsprogramm richtig zu verwenden:

```
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
}
```

## Deine Bündel einbinden
<a name="using-lint-with-bundles"></a>

Du kannst deine Bundles automatisch fesseln, indem du das Plugin importierst. `esbuild-plugin-eslint` Sie können es dann aktivieren, indem Sie einen `plugins` Wert angeben, der die Eslint-Funktionen aktiviert. Unten finden Sie ein Snippet, das die JavaScript Esbuild-API in einer Datei namens verwendet: `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 })],
})
```

## Quellzuordnungen verwenden
<a name="source-maps"></a>

Sie können eine Inline-Quellkarte (`sourcemap`) mit Ihrem JavaScript Code bereitstellen. Quellzuordnungen sind nützlich, wenn Sie bündeln JavaScript oder TypeScript programmieren und Verweise auf Ihre Eingabequelldateien in Ihren Protokollen und JavaScript Laufzeitfehlermeldungen sehen möchten.

Sie `sourcemap` müssen am Ende Ihres Codes erscheinen. Es wird durch eine einzelne Kommentarzeile definiert, die dem folgenden Format folgt:

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

Hier ein Beispiel:

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

Quellzuordnungen können mit esbuild erstellt werden. Das folgende Beispiel zeigt Ihnen, wie Sie die JavaScript Esbuild-API verwenden, um beim Erstellen und Bündeln von Code eine Inline-Quellenzuweisung einzubeziehen:

```
/* 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 })],
})
```

Insbesondere geben die `sourcesContent` Optionen `sourcemap` und an, dass am Ende jedes Builds eine Quellzuordnung in der Zeile hinzugefügt werden soll, den Quellinhalt jedoch nicht enthalten sollte. Als Konvention empfehlen wir, keine Quellinhalte in Ihre aufzunehmen`sourcemap`. Sie können dies in Esbuild deaktivieren, indem Sie `sources-content` auf `false` setzen.

Um zu veranschaulichen, wie Quellzuordnungen funktionieren, sehen Sie sich das folgende Beispiel an, in dem ein Resolver-Code auf Hilfsfunktionen aus einer Hilfsbibliothek verweist. Der Code enthält Protokollanweisungen im Resolver-Code und in der Hilfsbibliothek:

**. /src/default.resolver.ts** (dein Resolver)

```
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** (eine Hilfsdatei)

```
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..')
}
```

Wenn Sie die Resolver-Datei erstellen und bündeln, enthält Ihr Resolver-Code eine Inline-Quellzuweisung. Wenn Ihr Resolver ausgeführt wird, erscheinen die folgenden Einträge in den Protokollen: CloudWatch 

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


Wenn Sie sich die Einträge im CloudWatch Protokoll ansehen, werden Sie feststellen, dass die Funktionalität der beiden Dateien gebündelt wurde und gleichzeitig ausgeführt wird. Der ursprüngliche Dateiname jeder Datei spiegelt sich auch deutlich in den Protokollen wider.

# Testen Sie Ihren Resolver und Ihre Funktionshandler in AWS AppSync
<a name="test-resolvers"></a>

Sie können den `EvaluateCode` API-Befehl verwenden, um Ihren Resolver und Funktionshandler aus der Ferne mit gefälschten Daten zu testen, bevor Sie Ihren Code in einem Resolver oder einer Funktion speichern. Um mit dem Befehl zu beginnen, stellen Sie sicher, dass Sie die `appsync:evaluatecode` entsprechende Berechtigung zu Ihrer Richtlinie hinzugefügt haben. Beispiel:

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

****  

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

------

Sie können den Befehl nutzen, indem Sie die [AWS CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/index.html) oder verwenden [AWS SDKs](https://aws.amazon.com/tools/). Um beispielsweise Ihren Code mit der CLI zu testen, zeigen Sie einfach auf Ihre Datei, geben Sie einen Kontext an und geben Sie den Handler an, den Sie auswerten möchten:

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

Die Antwort `evaluationResult` enthält eine, die die von Ihrem Handler zurückgegebene Nutzlast enthält. Es enthält auch ein `logs` Objekt, das die Liste der Protokolle enthält, die von Ihrem Handler während der Auswertung generiert wurden. Auf diese Weise können Sie Ihre Codeausführung einfach debuggen und Informationen zu Ihrer Evaluierung abrufen, um die Fehlerbehebung zu erleichtern. Beispiel:

```
{
    "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\""
    ]
}
```

Das Evaluationsergebnis kann als JSON analysiert werden, was Folgendes ergibt:

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

Mit dem SDK können Sie auf einfache Weise Tests aus Ihrer Testsuite integrieren, um das Verhalten Ihres Codes zu überprüfen. Unser Beispiel hier verwendet das [Jest Testing Framework](https://jestjs.io/), aber jede Testsuite funktioniert. Der folgende Ausschnitt zeigt einen hypothetischen Validierungslauf. Beachten Sie, dass wir davon ausgehen, dass es sich bei der Bewertungsantwort um ein gültiges JSON handelt. Daher verwenden wir diese Methode, `JSON.parse` um JSON aus der Zeichenkettenantwort abzurufen:

```
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)
})
```

Dies führt zu dem folgenden Ergebnis:

```
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
```

# Migration von VTL zu in JavaScript AWS AppSync
<a name="migrating-resolvers"></a>

AWS AppSync ermöglicht es Ihnen, Ihre Geschäftslogik für Ihre Resolver und Funktionen mit VTL oder zu schreiben. JavaScript In beiden Sprachen schreiben Sie eine Logik, die den AWS AppSync Service anweist, wie er mit Ihren Datenquellen interagieren soll. Mit VTL schreiben Sie Zuordnungsvorlagen, die eine gültige JSON-kodierte Zeichenfolge ergeben müssen. Mit schreiben Sie JavaScript Anforderungs- und Antworthandler, die Objekte zurückgeben. Sie geben keine JSON-kodierte Zeichenfolge zurück.

Verwenden Sie zum Beispiel die folgende VTL-Zuordnungsvorlage, um ein Amazon DynamoDB DynamoDB-Element abzurufen:

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

Das Hilfsprogramm `$util.dynamodb.toDynamoDBJson` gibt eine JSON-kodierte Zeichenfolge zurück. Wenn auf gesetzt `$ctx.args.id` ist`<id>`, ergibt die Vorlage eine gültige JSON-kodierte Zeichenfolge:

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

Wenn Sie mit arbeiten JavaScript, müssen Sie keine rohen JSON-codierten Zeichenketten in Ihrem Code ausdrucken, und die Verwendung eines Hilfsprogramms wie ist nicht erforderlich. `toDynamoDBJson` Ein äquivalentes Beispiel für die obige Mapping-Vorlage ist:

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

Eine Alternative ist die Verwendung `util.dynamodb.toMapValues` des empfohlenen Ansatzes zur Behandlung eines Werteobjekts:

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

Das ergibt:

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

**Anmerkung**  
Wir empfehlen, das DynamoDB-Modul mit DynamoDB-Datenquellen zu verwenden:  

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

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

Nehmen Sie als weiteres Beispiel die folgende Zuordnungsvorlage, um ein Element in eine Amazon DynamoDB DynamoDB-Datenquelle einzufügen:

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

Bei der Auswertung muss diese Zeichenfolge für die Zuordnungsvorlage eine gültige JSON-kodierte Zeichenfolge ergeben. Bei Verwendung gibt Ihr Code JavaScript das Anforderungsobjekt direkt zurück:

```
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),
  };
}
```

was wie folgt ausgewertet wird:

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

**Anmerkung**  
Wir empfehlen, das DynamoDB-Modul mit DynamoDB-Datenquellen zu verwenden:  

```
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 })
}
```

# Wahl zwischen direktem Datenquellenzugriff und Proxying über eine Lambda-Datenquelle
<a name="choosing-data-source"></a>

Mit AWS AppSync und der `APPSYNC_JS` Runtime können Sie Ihren eigenen Code schreiben, der Ihre benutzerdefinierte Geschäftslogik implementiert, indem Sie AWS AppSync Funktionen für den Zugriff auf Ihre Datenquellen verwenden. Dies erleichtert Ihnen die direkte Interaktion mit Datenquellen wie Amazon DynamoDB, Aurora Serverless, OpenSearch Service, HTTP und anderen AWS Diensten APIs, ohne zusätzliche Rechendienste oder Infrastruktur bereitstellen zu müssen. AWS AppSync macht es auch einfach, mit einer AWS Lambda Funktion zu interagieren, indem eine Lambda-Datenquelle konfiguriert wird. Mit Lambda-Datenquellen können Sie komplexe Geschäftslogik ausführen und dabei alle Funktionen nutzen AWS Lambda, um eine GraphQL-Anfrage zu lösen. In den meisten Fällen bietet eine AWS AppSync Funktion, die direkt mit der Zieldatenquelle verbunden ist, alle Funktionen, die Sie benötigen. In Situationen, in denen Sie komplexe Geschäftslogik implementieren müssen, die von der `APPSYNC_JS` Laufzeit nicht unterstützt wird, können Sie eine Lambda-Datenquelle als Proxy für die Interaktion mit Ihrer Zieldatenquelle verwenden.


|  |  |  | 
| --- |--- |--- |
|  | Direkte Datenquellenintegration | Lambda-Datenquelle als Proxy | 
| Anwendungsfall | AWS AppSync Funktionen interagieren direkt mit API-Datenquellen. | AWS AppSync Funktionen rufen Lambdas auf, die mit API-Datenquellen interagieren. | 
| Laufzeit | APPSYNC\$1JS (JavaScript) | Jede unterstützte Lambda-Laufzeit | 
| Maximale Größe des Codes | 32.000 Zeichen pro Funktion AWS AppSync | 50 MB (gezippt, für direkten Upload) pro Lambda | 
| Externe Module | Eingeschränkt — nur von APPSYNC\$1JS unterstützte Funktionen | Ja | 
| Rufen Sie einen beliebigen Dienst an AWS  | Ja, es wird eine AWS AppSync HTTP-Datenquelle verwendet | Ja — SDK verwenden AWS  | 
| Zugriff auf den Anforderungsheader | Ja | Ja | 
| Netzwerkzugriff | Nein | Ja | 
| Zugriff auf das Dateisystem | Nein | Ja | 
| Protokollierung und Metriken | Ja | Ja | 
| Entwickeln und testen Sie komplett innerhalb AppSync | Ja | Nein | 
| Kaltstart | Nein | Nein — Mit bereitgestellter Parallelität | 
| Auto Scaling | Ja — transparent von AWS AppSync | Ja — Wie in Lambda konfiguriert | 
| Preisgestaltung | Keine zusätzlichen Kosten | Wird für die Nutzung von Lambda berechnet | 

AWS AppSync Funktionen, die sich direkt in ihre Zieldatenquelle integrieren lassen, eignen sich ideal für Anwendungsfälle wie die folgenden:
+  Interaktion mit Amazon DynamoDB, Aurora Serverless und Service OpenSearch 
+  Interaktion mit HTTP APIs und Weitergabe eingehender Header 
+  Interaktion mit AWS Diensten, die HTTP-Datenquellen verwenden (mit AWS AppSync automatischem Signieren von Anfragen mit der angegebenen Datenquellenrolle) 
+  Implementierung der Zugriffskontrolle vor dem Zugriff auf Datenquellen 
+  Implementierung der Filterung der abgerufenen Daten vor der Erfüllung einer Anfrage 
+  Implementierung einer einfachen Orchestrierung mit sequentieller Ausführung von AWS AppSync Funktionen in einer Resolver-Pipeline 
+  Steuerung von Caching- und Abonnementverbindungen bei Abfragen und Mutationen. 

AWS AppSync Funktionen, die eine Lambda-Datenquelle als Proxy verwenden, eignen sich ideal für Anwendungsfälle wie die folgenden:
+  Verwenden Sie eine andere Sprache als JavaScript Velocity Template Language (VTL) 
+  Anpassung und Steuerung der CPU oder des Speichers zur Leistungsoptimierung 
+  Importieren von Bibliotheken von Drittanbietern oder Anfordern nicht unterstützter Funktionen in `APPSYNC_JS` 
+  Mehrere Netzwerkanfragen stellen, Dateisystemzugriff and/or erhalten, um eine Anfrage zu erfüllen 
+  Batchverarbeitung von Anfragen mithilfe der [Batching-Konfiguration](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-lambda-js.html). 

# AWS AppSync JavaScript Resolver-Kontext-Objektreferenz
<a name="resolver-context-reference-js"></a>

AWS AppSync definiert eine Reihe von Variablen und Funktionen für die Arbeit mit Anfrage- und Antworthandlern. Dies erleichtert logische Operationen an Daten mit GraphQL. Dieses Dokument beschreibt diese Funktionen und enthält Beispiele.

## Zugreifen auf den `context`
<a name="accessing-the-context-js"></a>

Das `context` Argument eines Request- und Response-Handlers ist ein Objekt, das alle Kontextinformationen für Ihren Resolver-Aufruf enthält. Sie hat die folgende Struktur:

```
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;
};
```

**Anmerkung**  
Sie werden häufig feststellen, dass das `context` Objekt als bezeichnet wird. `ctx`

Jedes Feld im `context` Objekt ist wie folgt definiert:

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

** `arguments` **  
Eine Zuordnung, die alle GraphQL-Argumente für dieses Feld enthält.

** `identity` **  
Ein Objekt, das Informationen über den Aufrufer enthält. Weitere Informationen zur Struktur dieses Felds finden Sie unter [Identity](#aws-appsync-resolver-context-reference-identity-js).

** `source` **  
Eine Zuordnung, die die Auflösung des übergeordneten Feldes enthält.

** `stash` **  
Der Stash ist ein Objekt, das in jedem Resolver und Funktionshandler verfügbar gemacht wird. Das gleiche Stash-Objekt durchläuft einen einzigen Resolver-Lauf. Das bedeutet, dass Sie den Stash verwenden können, um beliebige Daten zwischen Anfrage- und Antworthandlern und zwischen Funktionen in einem Pipeline-Resolver zu übergeben.   
Sie können nicht den gesamten Stash löschen oder ersetzen, aber Sie können Eigenschaften des Stashs hinzufügen, aktualisieren, löschen und lesen. 
Sie können dem Stash Elemente hinzufügen, indem Sie eines der folgenden Codebeispiele ändern:  

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

//Example 2
Object.assign(ctx.stash, {key1: value1, key2: value})
```
Sie können Artikel aus dem Stash entfernen, indem Sie den folgenden Code ändern:  

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

** `result` **  
Ein Container für die Ergebnisse dieses Resolvers. Dieses Feld ist nur für Antworthandler verfügbar.  
Zum Beispiel, wenn Sie das `author` Feld der folgenden Abfrage auflösen:  

```
query {
    getPost(id: 1234) {
        postId
        title
        content
        author {
            id
            name
        }
    }
}
```
Dann ist die vollständige `context` Variable verfügbar, wenn ein Antworthandler ausgewertet wird:  

```
{
  "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` **  
Das Ergebnis einer beliebigen vorherigen Operation, die in einem Pipeline-Resolver ausgeführt wurde.  
Wenn der vorherige Vorgang der Anforderungshandler des Pipeline-Resolvers war, `ctx.prev.result` stellt er dieses Auswertungsergebnis dar und wird der ersten Funktion in der Pipeline zur Verfügung gestellt.  
Wenn die vorherige Operation die erste Funktion war, `ctx.prev.result` stellt sie das Auswertungsergebnis des Antworthandlers der ersten Funktion dar und wird der zweiten Funktion in der Pipeline zur Verfügung gestellt.  
Wenn die vorherige Operation die letzte Funktion war, `ctx.prev.result` stellt sie das Auswertungsergebnis der letzten Funktion dar und wird dem Response-Handler des Pipeline-Resolvers zur Verfügung gestellt.

** `info` **  
Ein Objekt, das Informationen über die GraphQL-Anforderung enthält. Die Struktur dieses Feldes finden Sie unter [Info](#aws-appsync-resolver-context-reference-info-js).

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

Der Abschnitt `identity` enthält Informationen über den Aufrufer. Die Form dieses Abschnitts hängt vom Autorisierungstyp Ihrer AWS AppSync API ab.

Weitere Informationen zu AWS AppSync Sicherheitsoptionen finden Sie unter [Autorisierung und Authentifizierung](security-authz.md#aws-appsync-security).

** `API_KEY`-Autorisierung**  
Das `identity` Feld ist nicht gefüllt.

**`AWS_LAMBDA`-Autorisierung**  
Das `identity` hat die folgende Form:  

```
type AppSyncIdentityLambda = {
  resolverContext: any;
};
```
Der `identity` enthält den `resolverContext` Schlüssel, der denselben `resolverContext` Inhalt enthält, der von der Lambda-Funktion zurückgegeben wurde, die die Anfrage autorisiert.

** `AWS_IAM`-Autorisierung**  
Der `identity` hat die folgende Form:  

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

** `AMAZON_COGNITO_USER_POOLS`-Autorisierung**  
Der `identity` hat die folgende Form:  

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

Jedes Feld ist wie folgt definiert:

** `accountId` **  
Die AWS Konto-ID des Anrufers.

** `claims` **  
Die Ansprüche, die der Benutzer hat.

** `cognitoIdentityAuthType` **  
Entweder authentifiziert oder nicht authentifiziert, basierend auf dem Identitätstyp.

** `cognitoIdentityAuthProvider` **  
Eine durch Kommas getrennte Liste mit Informationen zu externen Identitätsanbietern, anhand derer die Anmeldeinformationen abgerufen wurden, mit denen die Anfrage signiert wurde.

** `cognitoIdentityId` **  
Die Amazon Cognito Cognito-Identitäts-ID des Anrufers.

** `cognitoIdentityPoolId` **  
Die dem Anrufer zugeordnete Amazon Cognito Cognito-Identitätspool-ID.

** `defaultAuthStrategy` **  
Die Standardautorisierungsstrategie für diesen Aufrufer (`ALLOW` oder `DENY`).

** `issuer` **  
Der Aussteller des Tokens.

** `sourceIp` **  
Die Quell-IP-Adresse des Anrufers, der empfängt. AWS AppSync Wenn die Anfrage den `x-forwarded-for` Header nicht enthält, enthält der Quell-IP-Wert nur eine einzige IP-Adresse aus der TCP-Verbindung. Wenn die Anforderung einen `x-forwarded-for`-Header enthält, verfügt die Quell-IP zusätzlich zur IP-Adresse aus der TCP-Verbindung über eine Liste mit IP-Adressen aus dem `x-forwarded-for`-Header.

** `sub` **  
Die UUID des authentifizierten Benutzers.

** `user` **  
Der IAM-Benutzer.

** `userArn` **  
Der Amazon-Ressourcenname (ARN) des IAM-Benutzers.

** `username` **  
Der Benutzername des authentifizierten Benutzers. Bei einer `AMAZON_COGNITO_USER_POOLS`-Autorisierung ist der Wert des *Benutzernamens* der Wert des Attributs *cognito:username*. Im Fall einer `AWS_IAM` Autorisierung entspricht der Wert von *username* dem Wert des AWS Benutzerprinzipals. Wenn Sie die IAM-Autorisierung mit Anmeldeinformationen verwenden, die aus Amazon Cognito Cognito-Identitätspools stammen, empfehlen wir Ihnen, diese zu verwenden. `cognitoIdentityId`

### Auf Header von Anfragen zugreifen
<a name="aws-appsync-resolver-context-reference-util-js"></a>

AWS AppSync unterstützt die Übergabe benutzerdefinierter Header von Clients und den Zugriff auf sie in Ihren GraphQL-Resolvern mithilfe von. `ctx.request.headers` Sie können die Header-Werte dann für Aktionen wie das Einfügen von Daten in eine Datenquelle oder für Autorisierungsprüfungen verwenden. Sie können einzelne oder mehrere Anforderungsheader `$curl` mithilfe eines API-Schlüssels von der Befehlszeile aus verwenden, wie in den folgenden Beispielen gezeigt:

**Beispiel für einen einzelnen Header** 

Angenommen, Sie legen wie folgt einen `custom`-Header mit dem Wert `nadia` fest:

```
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
```

Darauf könnte dann mit `ctx.request.headers.custom` zugegriffen werden. Es könnte beispielsweise im folgenden Code für DynamoDB enthalten sein:

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

**Beispiel für mehrere Header** 

Sie können auch mehrere Header in einer einzigen Anfrage übergeben und im Resolver-Handler auf diese zugreifen. Zum Beispiel, wenn der `custom` Header mit zwei Werten festgelegt ist:

```
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
```

Sie können dann darauf als Array zugreifen, z. B. `ctx.request.headers.custom[1]`.

**Anmerkung**  
AWS AppSync macht den Cookie-Header in nicht verfügbar`ctx.request.headers`.

### Greifen Sie auf den angeforderten benutzerdefinierten Domainnamen zu
<a name="aws-access-requested-custom-domain-names-js"></a>

AWS AppSync unterstützt die Konfiguration einer benutzerdefinierten Domain, mit der Sie auf Ihre GraphQL- und Echtzeit-Endpunkte für Ihre zugreifen können. APIs Wenn Sie eine Anfrage mit einem benutzerdefinierten Domainnamen stellen, können Sie den Domainnamen mithilfe von abrufen. `ctx.request.domainName`

Bei Verwendung des standardmäßigen GraphQL-Endpunktdomänennamens lautet der Wert. `null`

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

Der Abschnitt `info` enthält Informationen über die GraphQL-Anforderung. Dieser Abschnitt hat die folgende Form:

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

Jedes Feld ist wie folgt definiert:

** `fieldName` **  
Der Name des Feldes, das derzeit aufgelöst wird.

** `parentTypeName` **  
Der Name des übergeordneten Typs für das Feld, das derzeit aufgelöst wird.

** `variables` **  
Eine Zuordnung, die alle Variablen enthält, die an die GraphQL-Anforderung übergeben werden.

** `selectionSetList` **  
Eine Listendarstellung der Felder im GraphQL-Auswahlsatz. Felder mit Aliasnamen werden nur durch den Aliasnamen referenziert, nicht durch den Feldnamen. Im folgenden Beispiel ist dies detailliert dargestellt.

** `selectionSetGraphQL` **  
Eine Zeichenfolgendarstellung des Auswahlsatzes, formatiert als GraphQL-Schemadefinitionssprache (SDL). Fragmente werden zwar nicht mit dem Auswahlsatz zusammengeführt, Inline-Fragmente bleiben jedoch erhalten, wie im folgenden Beispiel gezeigt.

**Anmerkung**  
`JSON.stringify`schließt `selectionSetGraphQL` und nicht `selectionSetList` in die Serialisierung der Zeichenfolge ein. Sie müssen direkt auf diese Eigenschaften verweisen.

Angenommen, Sie lösen das `getPost`-Feld der folgenden Abfrage auf:

```
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
  }
}
```

Dann könnte die vollständige `ctx.info` Variable, die bei der Verarbeitung eines Handlers verfügbar ist, wie folgt lauten:

```
{
  "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`macht nur Felder verfügbar, die zum aktuellen Typ gehören. Wenn es sich bei dem aktuellen Typ um eine Schnittstelle oder Union handelt, werden nur ausgewählte Felder angezeigt, die zur Schnittstelle gehören. Nehmen wir zum Beispiel das folgende Schema:

```
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
}
```

Und die folgende Abfrage:

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

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

`ctx.info.selectionSetList`Beim Aufrufen mit der `Query.node` Feldauflösung `id` wird nur angezeigt:

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

# AWS AppSync JavaScript Laufzeitfunktionen für Resolver und Funktionen
<a name="resolver-util-reference-js"></a>

Die `APPSYNC_JS` Laufzeitumgebung bietet ähnliche Funktionen wie [ECMAScript (ES) Version 6.0](https://262.ecma-international.org/6.0/). Sie unterstützt einen Teil ihrer Funktionen und bietet einige zusätzliche Methoden (Dienstprogramme), die nicht Teil der ES-Spezifikationen sind. In den folgenden Themen sind alle unterstützten Sprachfunktionen aufgeführt:
+  [Unterstützte Laufzeitfunktionen](https://docs.aws.amazon.com/appsync/latest/devguide/supported-features.html) — Erfahren Sie mehr über unterstützte Kernfunktionen, primitive Objekte, integrierte Objekte und Funktionen usw.
+  [Integrierte Hilfsprogramme](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html) — Die Variable util enthält allgemeine Hilfsmethoden, die Ihnen bei der Arbeit mit Daten helfen. Sofern nicht anders angegeben, verwenden alle Dienstprogramme den UTF-8-Zeichensatz.
+  [Integrierte Module](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-modules-js.html) — Erfahren Sie mehr darüber, wie integrierte Module beim Schreiben von JavaScript Resolvern und Funktionen helfen können.
+  [Runtime-Utilities](https://docs.aws.amazon.com/appsync/latest/devguide/runtime-utils-js.html) — Die Runtime-Bibliothek stellt Dienstprogramme zur Verfügung, mit denen Sie die Laufzeiteigenschaften Ihrer Resolver und Funktionen steuern oder ändern können.
+  [Zeithelfer in util.time — Die Variable util.time](https://docs.aws.amazon.com/appsync/latest/devguide/time-helpers-in-util-time-js.html) enthält Datetime-Methoden, mit deren Hilfe Zeitstempel generiert, zwischen Datetime-Formaten konvertiert und Datetime-Zeichenketten analysiert werden können. Darauf basiert die Syntax für Datetime-Formate, auf die Sie sich für weitere Dokumentationen beziehen können. [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)
+  [DynamoDB-Helfer in util.dynamodb — util.dynamodb](https://docs.aws.amazon.com/appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html) enthält Hilfsmethoden, die das Schreiben und Lesen von Daten in Amazon DynamoDB erleichtern, wie z. B. automatische Typzuweisung und Formatierung.
+  [HTTP-Helfer in util.http — Das Hilfsprogramm util.http](https://docs.aws.amazon.com/appsync/latest/devguide/http-helpers-in-utils-http-js.html) bietet Hilfsmethoden, mit denen Sie HTTP-Anforderungsparameter verwalten und Antwortheader hinzufügen können.
+  [Transformationshelfer in util.transform - util.transform](https://docs.aws.amazon.com/appsync/latest/devguide/transformation-helpers-in-utils-transform-js.html) enthält Hilfsmethoden, die es einfacher machen, komplexe Operationen mit Datenquellen durchzuführen.
+  [Zeichenkettenhelfer in util.str - util.str](https://docs.aws.amazon.com/appsync/latest/devguide/str-helpers-in-util-str-js.html) enthält Methoden, die bei gängigen String-Operationen helfen.
+  [Erweiterungen — Erweiterungen](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html) enthalten eine Reihe von Methoden, mit denen Sie zusätzliche Aktionen in Ihren Resolvern ausführen können.
+  [XML-Helfer in util.xml](https://docs.aws.amazon.com/appsync/latest/devguide/xml-helpers-in-util-xml-js.html) - util.xml enthält Methoden, die bei der Konvertierung von XML-Zeichenketten helfen.

**Anmerkung**  
Derzeit gilt diese Referenz nur für Runtime-Version **1.0.0**.

# Unterstützte Runtime-Funktionen
<a name="supported-features"></a>

In den folgenden Abschnitten werden die unterstützten Funktionen der APPSYNC\$1JS-Laufzeit beschrieben.

## Kern-Features
<a name="core-features"></a>

Die folgenden Kernfunktionen werden unterstützt.

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

Die folgenden Typen werden unterstützt:
+ Ziffern
+ Zeichenfolgen
+ Boolesche Werte
+ objects
+ Arrays
+ Funktionen

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

Operatoren werden unterstützt, darunter:
+ mathematische Standardoperatoren (`+``-``/`,`%`,`*`,, usw.)
+ Koaleszenzoperator () auf Null setzen `??`
+ Optionale Verkettung () `?.`
+ bitweise Operatoren
+ `void`und Operatoren `typeof`
+ Spread-Operatoren (`...`)

Die folgenden Operatoren werden nicht unterstützt:
+ unäre Operatoren (`++``--`, und`~`)
+ `in`-Operator
**Anmerkung**  
Verwenden Sie den `Object.hasOwn` Operator, um zu überprüfen, ob sich die angegebene Eigenschaft im angegebenen Objekt befindet.

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

Die folgenden Anweisungen werden unterstützt:
+ `const`
+ `let`
+ `var`
+ `break`
+ `else`
+ `for-in`
+ `for-of` 
+ `if`
+ `return`
+ `switch`
+ Spread-Syntax

Folgendes wird nicht unterstützt:
+ `catch`
+ `continue`
+ `do-while`
+ `finally`
+ `for(initialization; condition; afterthought)`
**Anmerkung**  
Die Ausnahmen sind `for-in` und `for-of` Ausdrücke, die unterstützt werden.
+ `throw`
+ `try`
+ `while`
+ beschriftete Aussagen

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

Die folgenden ES [6-Vorlagenliterale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) werden unterstützt:
+ Mehrzeilige Zeichenketten
+ Interpolation von Ausdrücken
+ Verschachtelte Vorlagen

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

Die folgende Funktionssyntax wird unterstützt:
+ Funktionsdeklarationen werden unterstützt.
+ ES 6-Pfeilfunktionen werden unterstützt.
+ Die ES 6-Restparameter-Syntax wird unterstützt.

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

Funktionen arbeiten standardmäßig im strikten Modus, sodass Sie Ihrem Funktionscode keine `use_strict`-Anweisung hinzufügen müssen. Dies können nicht geändert werden.

------

## Primitive Objekte
<a name="primitive-objects"></a>

Die folgenden primitiven Objekte von ES und ihre Funktionen werden unterstützt.

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

Die folgenden Objekte werden unterstützt:
+ `Object.assign()`
+ `Object.entries()` 
+ `Object.hasOwn()`
+ `Object.keys()` 
+ `Object.values()`
+ `delete` 

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

Die folgenden Zeichenketten werden unterstützt:
+  `String.prototype.length()` 
+  `String.prototype.charAt()` 
+  `String.prototype.concat()` 
+  `String.prototype.endsWith()` 
+  `String.prototype.indexOf()` 
+  `String.prototype.lastIndexOf()` 
+  `String.raw()` 
+  `String.prototype.replace()`
**Anmerkung**  
Reguläre Ausdrücke werden nicht unterstützt.   
Konstrukte regulärer Ausdrücke im Java-Stil werden jedoch im angegebenen Parameter unterstützt. [Weitere Informationen finden Sie unter Muster.](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)
+ `String.prototype.replaceAll()`
**Anmerkung**  
Reguläre Ausdrücke werden nicht unterstützt.  
Konstrukte regulärer Ausdrücke im Java-Stil werden jedoch im angegebenen Parameter unterstützt. [Weitere Informationen finden Sie unter Muster.](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 ]

Die folgenden Zahlen werden unterstützt:
+  `Number.isFinite` 
+  `Number.isNaN` 

------

## Integrierte Objekte und Funktionen
<a name="built-in-objects-functions"></a>

Die folgenden Funktionen und Objekte werden unterstützt.

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

Die folgenden mathematischen Funktionen werden unterstützt:
+  `Math.random()` 
+  `Math.min()` 
+  `Math.max()` 
+  `Math.round()` 
+  `Math.floor()` 
+  `Math.ceil()` 

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

Die folgenden Array-Methoden werden unterstützt:
+ `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()`
**Anmerkung**  
`Array.prototype.sort()`unterstützt keine Argumente.
+ `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 ]

Das Konsolenobjekt ist für das Debuggen verfügbar. Während der Live-Abfrageausführung werden log/error Konsolenanweisungen an Amazon CloudWatch Logs gesendet (sofern die Protokollierung aktiviert ist). Während der Codeauswertung mit `evaluateCode` werden Protokollanweisungen in der Befehlsantwort zurückgegeben.
+ `console.error()`
+ `console.log()`

------
#### [ Function ]
+ Die `call` Methoden `apply``bind`, und werden nicht unterstützt.
+ Funktionskonstruktoren werden nicht unterstützt.
+ Die Übergabe einer Funktion als Argument wird nicht unterstützt.
+ Rekursive Funktionsaufrufen werden nicht unterstützt.

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

Die folgenden JSON-Methoden werden unterstützt:
+ `JSON.parse()`
**Anmerkung**  
Gibt eine leere Zeichenfolge zurück, wenn die analysierte Zeichenfolge kein gültiges JSON ist.
+ `JSON.stringify()`

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

Asynchrone Prozesse werden nicht unterstützt, und Promises werden nicht unterstützt.

**Anmerkung**  
Der Netzwerk- und Dateisystemzugriff wird in der `APPSYNC_JS` Runtime in AWS AppSync nicht unterstützt. AWS AppSync verarbeitet alle I/O-Operationen, die auf den vom AWS AppSync Resolver oder der AWS AppSync Funktion gestellten Anforderungen basieren.

------

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

Die folgenden globalen Konstanten werden unterstützt:
+  `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`

## Arten von Fehlern
<a name="error-types"></a>

Das Auslösen von Fehlern mit `throw` wird nicht unterstützt. Sie können einen Fehler zurückgeben, indem Sie die `util.error()` Funktion verwenden. Sie können einen Fehler in Ihre GraphQL-Antwort aufnehmen, indem Sie die `util.appendError` Funktion verwenden.

Weitere Informationen finden Sie unter [Error utils](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html#utility-helpers-in-error-js).

# Integrierte Dienstprogramme
<a name="built-in-util-js"></a>

Die `util` Variable enthält allgemeine Hilfsmethoden, die Ihnen bei der Arbeit mit Daten helfen. Sofern nicht anders angegeben, verwenden alle Dienstprogramme den UTF-8-Zeichensatz.

## Werkzeuge zum Kodieren
<a name="utility-helpers-in-encoding"></a>

### Liste der Kodierungswerkzeuge
<a name="utility-helpers-in-encoding-list-js"></a>

 **`util.urlEncode(String)`**  
Gibt die Eingabezeichenfolge als eine `application/x-www-form-urlencoded`-kodierte Zeichenfolge zurück.

 **`util.urlDecode(String)`**  
Dekodiert eine `application/x-www-form-urlencoded`-kodierte Zeichenfolge zurück in ihre nicht kodierte Form.

**`util.base64Encode(string) : string`**  
Verschlüsselt die Eingabe in eine base64-kodierte Zeichenfolge.

**`util.base64Decode(string) : string`**  
Decodiert die Daten einer base64-verschlüsselten Zeichenfolge.

## Dienstprogramme zur ID-Generierung
<a name="utility-helpers-in-id-gen-js"></a>

### Liste der Tools zur ID-Generierung
<a name="utility-helpers-in-id-gen-list-js"></a>

 **`util.autoId()`**  
Gibt eine zufällig generierte 128-Bit-UUID zurück.

**`util.autoUlid()`**  
Gibt eine zufällig generierte 128-Bit-ULID (Universally Unique Lexicographically Sortable Identifier) zurück.

**`util.autoKsuid()`**  
Gibt eine zufällig generierte 128-Bit-KSUID (K-Sortable Unique Identifier) Base62 zurück, die als Zeichenfolge mit einer Länge von 27 codiert ist.

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

### Fehler-Utils-Liste
<a name="utility-helpers-in-error-list-js"></a>

 **`util.error(String, String?, Object?, Object?)`**  
Gibt einen benutzerdefinierte Fehler aus. Dies kann in Anforderungs- oder Antwortzuweisungsvorlagen verwendet werden, wenn die Vorlage einen Fehler bei der Anforderung oder beim Aufrufergebnis erkennt. Zusätzlich können ein `errorType` Feld, ein `data` Feld und ein `errorInfo` Feld angegeben werden. Der `data`-Wert wird zum entsprechenden `error`-Block in `errors` in der GraphQL-Antwort hinzugefügt.  
`data`wird auf der Grundlage des Abfrageauswahlsatzes gefiltert. Der `errorInfo`-Wert wird zum entsprechenden `error`-Block in `errors` in der GraphQL-Antwort hinzugefügt.  
`errorInfo`wird **nicht** auf der Grundlage des Abfrageauswahlsatzes gefiltert.

 **`util.appendError(String, String?, Object?, Object?)`**  
Fügt einen benutzerdefinierten Fehler an. Dies kann in Anforderungs- oder Antwortzuweisungsvorlagen verwendet werden, wenn die Vorlage einen Fehler bei der Anforderung oder beim Aufrufergebnis erkennt. Zusätzlich können ein `errorType` Feld, ein `data` Feld und ein `errorInfo` Feld angegeben werden. Im Gegensatz zu `util.error(String, String?, Object?, Object?)` wird die Vorlagenbewertung nicht unterbrochen, sodass die Daten an den Aufrufer zurückgegeben werden können. Der `data`-Wert wird zum entsprechenden `error`-Block in `errors` in der GraphQL-Antwort hinzugefügt.  
`data`wird auf der Grundlage des Abfrageauswahlsatzes gefiltert. Der `errorInfo`-Wert wird zum entsprechenden `error`-Block in `errors` in der GraphQL-Antwort hinzugefügt.  
`errorInfo`wird **nicht** auf der Grundlage des Abfrageauswahlsatzes gefiltert.

## Tools für den Typ- und Musterabgleich
<a name="utility-helpers-in-patterns-js"></a>

### Liste der Tools für den Typ- und Musterabgleich
<a name="utility-helpers-in-patterns-js-list"></a>

**`util.matches(String, String) : Boolean`**  
Gibt "true" zurück, wenn das angegebene Muster im ersten Argument den bereitgestellten Daten im zweiten Argument entspricht. Das Muster muss ein regulärer Ausdruck sein, wie z. B. `util.matches("a*b", "aaaaab")`. Die Funktionalität basiert auf [Pattern](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html), worauf Sie zur weiteren Dokumentation verweisen können.

 **`util.authType()`**   
Gibt eine Zeichenfolge zurück, die den Multi-Auth-Typ beschreibt, der von einer Anfrage verwendet wird, und gibt entweder „IAM-Autorisierung“, „Benutzerpool-Autorisierung“, „Open ID Connect-Autorisierung“ oder „API-Schlüsselautorisierung“ zurück.

## Gibt den Wert zurück, Verhalten, utils
<a name="utility-helpers-in-cloudwatch-logs-list-js"></a>

### Liste der Verhaltenswerkzeuge für den Rückgabewert
<a name="utility-helpers-in-behavior-list-js"></a>

 **`util.escapeJavaScript(String)`**  
Gibt die Eingabezeichenfolge als JavaScript Escape-Zeichenfolge zurück.

## Tools zur Autorisierung von Resolver
<a name="utility-helpers-in-resolver-auth-js"></a>

### Liste der Resolver-Autorisierungswerkzeuge
<a name="utility-helpers-in-resolver-auth-list-js"></a>

 **`util.unauthorized()`**  
Gibt `Unauthorized` für das Feld aus, das aufgelöst wird. Verwenden Sie dies in Vorlagen für die Zuordnung von Anfragen oder Antworten, um zu bestimmen, ob der Anrufer das Feld auflösen darf.

# Integrierten Module
<a name="built-in-modules-js"></a>

Module sind Teil der `APPSYNC_JS` Runtime und stellen Hilfsprogramme zur Verfügung, mit denen JavaScript Resolver und Funktionen geschrieben werden können. Beispiele und Beispiele finden Sie im [aws-appsync-resolver-samples](https://github.com/aws-samples/aws-appsync-resolver-samples) GitHub Repository.

## Funktionen des DynamoDB-Moduls
<a name="built-in-ddb-modules"></a>

DynamoDB-Modulfunktionen bieten eine verbesserte Erfahrung bei der Interaktion mit DynamoDB-Datenquellen. Sie können mithilfe der Funktionen Anfragen an Ihre DynamoDB-Datenquellen stellen, ohne eine Typzuordnung hinzuzufügen. 

Module werden wie folgt importiert: `@aws-appsync/utils/dynamodb`

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

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

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

 **` get<T>(payload: GetInput): DynamoDBGetItemRequest`**  
Informationen [Eingaben](#built-in-ddb-modules-inputs) zu finden Sie unter GetInput.
Generiert ein `DynamoDBGetItemRequest` Objekt, um eine [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-getitem)Anfrage an DynamoDB zu stellen.  

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

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

 **`put<T>(payload): DynamoDBPutItemRequest`**  
Generiert ein `DynamoDBPutItemRequest` Objekt, um eine [PutItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem)Anfrage an DynamoDB zu stellen.  

```
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`**  
Generiert ein `DynamoDBDeleteItemRequest` Objekt, um eine [DeleteItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-deleteitem)Anfrage an DynamoDB zu stellen.  

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

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

**`scan<T>(payload): DynamoDBScanRequest`**  
Generiert eine`DynamoDBScanRequest`, um eine [Scan-Anfrage](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan) an DynamoDB zu stellen.  

```
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`**  
Generiert ein `DynamoDBSyncRequest` Objekt, um eine [Sync-Anfrage](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-sync) zu stellen. Die Anfrage empfängt nur die Daten, die seit der letzten Abfrage geändert wurden (Delta-Updates). Anfragen können nur an versionierte DynamoDB-Datenquellen gestellt werden.  

```
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`**  
Generiert ein `DynamoDBUpdateItemRequest` Objekt, um eine [UpdateItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-updateitem)Anfrage an DynamoDB zu stellen.

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

Mithilfe von Operationshelfern können Sie bei Aktualisierungen bestimmte Aktionen für Teile Ihrer Daten ausführen. Importieren Sie zunächst `operations` aus`@aws-appsync/utils/dynamodb`:

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

#### Liste der Operationen
<a name="built-in-ddb-modules-operations-list"></a>

 **`add<T>(payload)`**  
Eine Hilfsfunktion, die beim Aktualisieren von DynamoDB ein neues Attributelement hinzufügt.  
**Beispiel**  
So fügen Sie einem vorhandenen DynamoDB-Element mithilfe des ID-Werts eine Adresse (Straße, Ort und Postleitzahl) hinzu:  

```
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)`**  
Eine Hilfsfunktion, die eine Nutzlast an die bestehende Liste in DynamoDB anhängt.  
**Beispiel**  
So fügen Sie während eines Updates einen neu hinzugefügten Freund IDs (`newFriendIds`) an eine bestehende Freundesliste (`friendsIds`) an:  

```
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?)`**  
Eine Hilfsfunktion, die den vorhandenen Attributwert im Element verringert, wenn DynamoDB aktualisiert wird.  
**Beispiel**  
Um den Zähler eines Freundes () `friendsCount` um 10 zu verringern:  

```
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?)`**  
Eine Hilfsfunktion, die den vorhandenen Attributwert im Element erhöht, wenn DynamoDB aktualisiert wird.  
**Beispiel**  
Um den Zähler eines Freundes () `friendsCount` um 10 zu erhöhen:  

```
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)`**  
Eine Hilfsfunktion, die der vorhandenen Liste in DynamoDB vorangestellt wird.  
**Beispiel**  
Um einen neu hinzugefügten Freund IDs (`newFriendIds`) während eines Updates einer bestehenden Freundesliste (`friendsIds`) voranzustellen:  

```
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)`**  
Eine Hilfsfunktion, die ein vorhandenes Attribut ersetzt, wenn ein Element in DynamoDB aktualisiert wird. Dies ist nützlich, wenn Sie das gesamte Objekt oder Unterobjekt im Attribut aktualisieren möchten und nicht nur die Schlüssel in der Nutzlast.  
**Beispiel**  
Um eine Adresse (Straße, Ort und Postleitzahl) in einem Objekt zu ersetzen: `info`  

```
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)`**  
Eine Hilfsfunktion, die ein Element in einer Liste ersetzt.  
**Beispiel**  
Im Rahmen von update (`newFriendIds`) wurden in diesem Beispiel die `updateListItem` ID-Werte des zweiten Elements (index:`1`, neue ID:`102`) und des dritten Elements (index:`2`, neue ID:`112`) in einer Liste (`friendsIds`) aktualisiert.  

```
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 });
}
```

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

#### Liste der Eingaben
<a name="built-in-ddb-modules-inputs-list"></a>

 **`Type GetInput<T>`**  

```
GetInput<T>: { 
    consistentRead?: boolean; 
    key: DynamoDBKey<T>; 
}
```
**Deklaration eingeben**  
+ `consistentRead?: boolean` (optional)

  Ein optionaler boolescher Wert, um anzugeben, ob Sie mit DynamoDB einen stark konsistenten Lesevorgang durchführen möchten.
+ `key: DynamoDBKey<T>` (Erforderlich)

  Ein erforderlicher Parameter, der den Schlüssel des Elements in DynamoDB angibt. DynamoDB-Elemente können einen einzelnen Hashschlüssel oder Hash- und Sortierschlüssel haben.

**`Type PutInput<T>`**  

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

  Wenn Sie ein Objekt in eine DynamoDB-Tabelle einfügen, können Sie optional einen bedingten Ausdruck angeben, der steuert, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Zustand des Objekts, das sich bereits in DynamoDB befand, bevor der Vorgang ausgeführt wird.
+ `customPartitionKey?: string` (optional)

  Wenn diese Option aktiviert ist, ändert dieser Zeichenfolgenwert das Format der `ds_sk` und `ds_pk` -Datensätze, die von der Delta-Sync-Tabelle verwendet werden, wenn die Versionierung aktiviert wurde. Wenn diese Option aktiviert ist, ist auch die Verarbeitung des `populateIndexFields` Eintrags aktiviert. 
+ `item: Partial<T>` (Erforderlich)

  Die restlichen Attribute des Elements sollen in DynamoDB platziert werden.
+ `key: DynamoDBKey<T>` (Erforderlich)

  Ein erforderlicher Parameter, der den Schlüssel des Elements in DynamoDB angibt, für das der Put ausgeführt wird. DynamoDB-Elemente können einen einzelnen Hashschlüssel oder Hash- und Sortierschlüssel haben.
+ `populateIndexFields?: boolean` (optional)

  Ein boolescher Wert, der, wenn er zusammen mit dem aktiviert wird`customPartitionKey`, neue Einträge für jeden Datensatz in der Delta-Synchronisierungstabelle erstellt, insbesondere in den Spalten und. `gsi_ds_pk` `gsi_ds_sk` Weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*.

**`Type QueryInput<T>`**  

```
QueryInput<T>: ScanInput<T> & { 
    query: DynamoDBKeyCondition<Required<T>>; 
}
```
**Geben Sie Erklärung ein**  
+ `query: DynamoDBKeyCondition<Required<T>>` (Erforderlich)

  Gibt eine Schlüsselbedingung an, die die abzufragenden Elemente beschreibt. Für einen bestimmten Index sollte die Bedingung für einen Partitionsschlüssel eine Gleichheit und der Sortierschlüssel ein Vergleich oder ein `beginsWith` (wenn es sich um eine Zeichenfolge handelt) sein. Für Partitions- und Sortierschlüssel werden nur Zahlen- und Zeichenfolgentypen unterstützt.

  **Beispiel**

  Nehmen Sie den folgenden `User` Typ:

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

  Die Abfrage kann nur die folgenden Felder enthalten: `id``name`, und`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; 
}
```
**Geben Sie Erklärung ein**  
+ `_version?: number` (optional)
+ `condition?: DynamoDBFilterObject<T>` (optional)

  Wenn Sie ein Objekt in DynamoDB entfernen, können Sie optional einen bedingten Ausdruck angeben, der steuert, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Zustand des Objekts, das sich bereits in DynamoDB befand, bevor der Vorgang ausgeführt wird.

  **Beispiel**

  Das folgende Beispiel ist ein `DeleteItem` Ausdruck, der eine Bedingung enthält, die es ermöglicht, dass der Vorgang nur dann erfolgreich ist, wenn der Eigentümer des Dokuments mit dem Benutzer übereinstimmt, der die Anfrage gestellt hat.

  ```
  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` (optional)

  Wenn diese Option aktiviert ist, ändert der `customPartitionKey` Wert das Format der `ds_sk` und `ds_pk` -Datensätze, die von der Delta-Synchronisierungstabelle verwendet werden, wenn die Versionsverwaltung aktiviert wurde. Wenn diese Option aktiviert ist, ist auch die Verarbeitung des `populateIndexFields` Eintrags aktiviert. 
+ `key: DynamoDBKey<T>` (Erforderlich)

  Ein erforderlicher Parameter, der den Schlüssel des Elements in DynamoDB angibt, das entfernt wird. DynamoDB-Elemente können einen einzelnen Hashschlüssel oder Hash- und Sortierschlüssel haben.

  **Beispiel**

  Wenn a `User` nur den Hash-Schlüssel mit einem Benutzer hat`id`, würde der Schlüssel wie folgt aussehen:

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

  Wenn der Tabellenbenutzer einen Hash-Schlüssel (`id`) und einen Sortierschlüssel (`name`) hat, dann würde der Schlüssel so aussehen:

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

  Ein boolescher Wert, der, wenn er zusammen mit dem aktiviert wird`customPartitionKey`, neue Einträge für jeden Datensatz in der Delta-Sync-Tabelle erstellt, insbesondere in den Spalten `gsi_ds_pk` und`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; 
}
```
**Deklaration eingeben**  
+ `consistentRead?: boolean | null` (optional)

  Ein optionaler boolescher Wert zur Angabe konsistenter Lesevorgänge bei der Abfrage von DynamoDB. Der Standardwert ist `false`.
+ `filter?: DynamoDBFilterObject<T> | null` (optional)

  Ein optionaler Filter, der auf die Ergebnisse angewendet wird, nachdem sie aus der Tabelle abgerufen wurden.
+ `index?: string | null` (optional)

  Ein optionaler Name des zu scannenden Indexes.
+ `limit?: number | null` (optional)

  Eine optionale maximale Anzahl von Ergebnissen, die zurückgegeben werden sollen.
+ `nextToken?: string | null` (optional)

  Ein optionales Paginierungstoken, um eine vorherige Abfrage fortzusetzen. Dieses wäre von einer vorherigen Abfrage erhalten worden.
+ `scanIndexForward?: boolean | null` (optional)

  Ein optionaler boolescher Wert, der angibt, ob die Abfrage in aufsteigender oder absteigender Reihenfolge ausgeführt wird. Standardmäßig ist dieser Wert auf `true` festgelegt.
+ `segment?: number` (optional)
+ `select?: DynamoDBSelectAttributes` (optional)

  Von DynamoDB zurückzugebende Attribute. Standardmäßig gibt der AWS AppSync DynamoDB-Resolver nur Attribute zurück, die in den Index projiziert werden. Die unterstützten Werte sind:
  + `ALL_ATTRIBUTES`

    Gibt alle Elementattribute aus der angegebenen Tabelle oder dem angegebenen Index zurück. Wenn Sie einen lokalen sekundären Index abfragen, ruft DynamoDB für jedes übereinstimmende Element im Index das gesamte Element aus der übergeordneten Tabelle ab. Wenn der Index konfiguriert ist, um alle Elementattribute zu projizieren, können Sie alle Daten aus dem lokalen sekundären Index erhalten und das Abrufen ist nicht erforderlich.
  + `ALL_PROJECTED_ATTRIBUTES`

    Gibt alle Attribute zurück, die in den Index projiziert wurden. Wenn der Index konfiguriert ist, um alle Attribute zu projizieren, entspricht dieser Rückgabewert der Angabe von `ALL_ATTRIBUTES`.
  + `SPECIFIC_ATTRIBUTES`

    Gibt nur die in aufgeführten Attribute zurück`ProjectionExpression`. Dieser Rückgabewert entspricht der Angabe `ProjectionExpression` ohne Angabe eines Werts für`AttributesToGet`.
+ `totalSegments?: number` (optional)

**`Type DynamoDBSyncInput<T>`**  

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

  Der Partitionsschlüssel der Basistabelle, der bei der Ausführung eines Sync-Vorgangs verwendet werden soll. Dieses Feld ermöglicht die Ausführung eines Synchronisierungsvorgangs, wenn die Tabelle einen benutzerdefinierten Partitionsschlüssel verwendet.
+ `deltaIndexName?: string` (optional)

  Der Index, der für den Sync-Vorgang verwendet wird. Dieser Index ist erforderlich, um einen Sync-Vorgang für die gesamte Delta-Store-Tabelle zu aktivieren, wenn die Tabelle einen benutzerdefinierten Partitionsschlüssel verwendet. Der Synchronisierungsvorgang wird auf der GSI (erstellt am `gsi_ds_pk` und`gsi_ds_sk`) ausgeführt.
+ `filter?: DynamoDBFilterObject<T> | null` (optional)

  Ein optionaler Filter, der auf die Ergebnisse angewendet wird, nachdem sie aus der Tabelle abgerufen wurden.
+ `lastSync?: number` (optional)

  Der Moment in Epochen-Millisekunden, zu dem der letzte erfolgreiche Synchronisierungsvorgang gestartet wurde. Wenn angegeben, werden nur Elemente zurückgegeben, die sich nach `lastSync` geändert haben. Dieses Feld sollte erst gefüllt werden, nachdem alle Seiten eines ersten Synchronisierungsvorgangs abgerufen wurden. Wenn es weggelassen wird, werden Ergebnisse aus der Basistabelle zurückgegeben. Andernfalls werden Ergebnisse aus der Delta-Tabelle zurückgegeben.
+ `limit?: number | null` (optional)

  Eine optionale maximale Anzahl von Elementen, die gleichzeitig ausgewertet werden können. Wenn nicht angegeben, wird das Standardlimit auf `100` Elemente festgelegt. Der maximale Wert für dieses Feld ist `1000` Elemente.
+ `nextToken?: string | null` (optional)

**`Type DynamoDBUpdateInput<T>`**  

```
DynamoDBUpdateInput<T>: { 
    _version?: number; 
    condition?: DynamoDBFilterObject<T>; 
    customPartitionKey?: string; 
    key: DynamoDBKey<T>; 
    populateIndexFields?: boolean; 
    update: DynamoDBUpdateObject<T>; 
}
```
**Geben Sie Erklärung ein**  
+ `_version?: number` (optional)
+ `condition?: DynamoDBFilterObject<T>` (optional)

  Wenn Sie ein Objekt in DynamoDB aktualisieren, können Sie optional einen bedingten Ausdruck angeben, der steuert, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Zustand des Objekts, das sich bereits in DynamoDB befand, bevor der Vorgang ausgeführt wird.
+ `customPartitionKey?: string` (optional)

  Wenn diese Option aktiviert ist, ändert der `customPartitionKey` Wert das Format der `ds_pk` AND-Datensätze, die von der `ds_sk` Delta-Synchronisierungstabelle verwendet werden, wenn die Versionierung aktiviert wurde. Wenn diese Option aktiviert ist, ist auch die Verarbeitung des `populateIndexFields` Eintrags aktiviert. 
+ `key: DynamoDBKey<T>` (Erforderlich)

  Ein erforderlicher Parameter, der den Schlüssel des Elements in DynamoDB angibt, das aktualisiert wird. DynamoDB-Elemente können einen einzelnen Hashschlüssel oder Hash- und Sortierschlüssel haben.
+ `populateIndexFields?: boolean` (optional)

  Ein boolescher Wert, der, wenn er zusammen mit dem aktiviert wird`customPartitionKey`, neue Einträge für jeden Datensatz in der Delta-Synchronisierungstabelle erstellt, insbesondere in den Spalten und. `gsi_ds_pk` `gsi_ds_sk` 
+ `update: DynamoDBUpdateObject<T>`

  Ein Objekt, das die zu aktualisierenden Attribute zusammen mit den neuen Werten für sie angibt. Das Aktualisierungsobjekt kann mit`add`,,`remove`,`replace`,`increment`,`decrement`, `append``prepend`, verwendet werden`updateListItem`.

## Funktionen des Amazon RDS-Moduls
<a name="built-in-rds-modules"></a>

Die Funktionen des Amazon RDS-Moduls bieten eine verbesserte Benutzererfahrung bei der Interaktion mit Datenbanken, die mit der Amazon RDS-Daten-API konfiguriert sind. Das Modul wird importiert mit`@aws-appsync/utils/rds`: 

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

Funktionen können auch einzeln importiert werden. Zum Beispiel verwendet der folgende Import`sql`:

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

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

Sie können die Hilfsprogramme des AWS AppSync RDS-Moduls verwenden, um mit Ihrer Datenbank zu interagieren.

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

Das `select` Hilfsprogramm erstellt eine `SELECT` Anweisung zur Abfrage Ihrer relationalen Datenbank. 

**Grundlegende Verwendung**

In ihrer Grundform können Sie die Tabelle angeben, die Sie abfragen möchten:

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

export function request(ctx) {

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

Beachten Sie, dass Sie das Schema auch in Ihrem Tabellen-Identifier angeben können:

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

export function request(ctx) {

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

**Spalten angeben**

Sie können Spalten mit der `columns` Eigenschaft angeben. Wenn dieser Wert nicht auf einen Wert gesetzt ist, wird standardmäßig wie folgt vorgegeben`*`:

```
export function request(ctx) {

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

Sie können auch die Tabelle einer Spalte angeben:

```
export function request(ctx) {

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

**Grenzwerte und Offsets**

Sie können `limit` und auf `offset` die Abfrage anwenden:

```
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
    }));
}
```

**Sortiert nach**

Sie können Ihre Ergebnisse nach der `orderBy` Eigenschaft sortieren. Geben Sie eine Reihe von Objekten an, die die Spalte und eine optionale `dir` Eigenschaft angeben:

```
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**

Sie können Filter erstellen, indem Sie das Objekt mit der speziellen Bedingung verwenden:

```
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'}}
    }));
}
```

Sie können Filter auch kombinieren:

```
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}}
    }));
}
```

Sie können auch `OR` Aussagen erstellen:

```
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 } }
        ]}
    }));
}
```

Sie können eine Bedingung auch negieren mit`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 } }
        ]}
    }));
}
```

Sie können auch die folgenden Operatoren verwenden, um Werte zu vergleichen:


| 
| 
| Operator | Description | Mögliche Wertetypen | 
| --- |--- |--- |
| eq | Gleich | Zahl, Zeichenfolge, boolescher Wert | 
| Eins | Ungleich | Zahl, Zeichenfolge, boolescher Wert | 
| le | Kleiner als oder gleich | Zahl, Zeichenfolge | 
| lt | Kleiner als | Zahl, Zeichenfolge | 
| ge | Größer als oder gleich | Zahl, Zeichenfolge | 
| gt | Größer als | Zahl, Zeichenfolge | 
| enthält | Wie | Zeichenfolge | 
| Nicht enthält | Nicht wie | Zeichenfolge | 
| Beginnt mit | Beginnt mit einem Präfix | Zeichenfolge | 
| zwischen | Zwischen zwei Werten | Zahl, Zeichenfolge | 
| Das Attribut ist vorhanden | Das Attribut ist nicht Null | Zahl, Zeichenfolge, boolescher Wert | 
| size | prüft die Länge des Elements | Zeichenfolge | 

#### Einfügen
<a name="built-in-rds-modules-functions-insert"></a>

Das `insert` Hilfsprogramm bietet eine einfache Möglichkeit, mit dem `INSERT` Vorgang einzelne Zeilenelemente in Ihre Datenbank einzufügen.

**Einfügungen einzelner Elemente**

Um ein Element einzufügen, geben Sie die Tabelle an und übergeben Sie dann Ihr Werteobjekt. Die Objektschlüssel sind Ihren Tabellenspalten zugeordnet. Spaltennamen werden automatisch maskiert, und Werte werden mithilfe der Variablenzuordnung an die Datenbank gesendet:

```
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)
}
```

**MySQL-Anwendungsfall**

Sie können ein `insert` gefolgt von einem kombinieren`select`, um Ihre eingefügte Zeile abzurufen:

```
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)
}
```

**Anwendungsfall Postgres**

Mit Postgres können Sie Daten aus der Zeile abrufen [https://www.postgresql.org/docs/current/dml-returning.html](https://www.postgresql.org/docs/current/dml-returning.html), die Sie eingefügt haben. Es akzeptiert `*` oder ein Array von Spaltennamen:

```
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)
}
```

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

Das `update` Tool ermöglicht es Ihnen, bestehende Zeilen zu aktualisieren. Sie können das Bedingungsobjekt verwenden, um Änderungen an den angegebenen Spalten in allen Zeilen vorzunehmen, die die Bedingung erfüllen. Nehmen wir zum Beispiel an, wir haben ein Schema, das es uns ermöglicht, diese Mutation vorzunehmen. Wir wollen das `name` von `Person` mit dem `id` Wert von aktualisieren, `3` aber nur, wenn wir sie (`known_since`) seit dem Jahr kennen`2000`:

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

Unser Update Resolver sieht so aus:

```
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)
}
```

Wir können unserer Bedingung ein Häkchen hinzufügen, um sicherzustellen, dass nur die Zeile aktualisiert `3` wird, deren Primärschlüssel `id` gleich ist. In ähnlicher Weise können Sie Postgres verwenden`inserts`, `returning` um die geänderten Daten zurückzugeben. 

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

Mit dem `remove` Hilfsprogramm können Sie vorhandene Zeilen löschen. Sie können das Bedingungsobjekt für alle Zeilen verwenden, die die Bedingung erfüllen. Beachten Sie, dass `delete` es sich um ein reserviertes Schlüsselwort in handelt JavaScript. `remove`sollte stattdessen verwendet werden:

```
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)
}
```

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

In einigen Fällen benötigen Sie möglicherweise genauere Angaben zum richtigen Objekttyp, den Sie in Ihrer Anweisung verwenden möchten. Sie können die bereitgestellten Typhinweise verwenden, um den Typ Ihrer Parameter anzugeben. AWS AppSync unterstützt [dieselben Typhinweise](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html#rdsdtataservice-Type-SqlParameter-typeHint) wie die Daten-API. Sie können Ihre Parameter mithilfe der `typeHint` Funktionen des AWS AppSync `rds` Moduls umwandeln. 

Das folgende Beispiel ermöglicht es Ihnen, ein Array als Wert zu senden, der als JSON-Objekt umgewandelt wird. Wir verwenden den `->` Operator, um das Element `index` `2` im JSON-Array abzurufen:

```
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 ist auch nützlich bei der Handhabung und beim Vergleichen von `DATE``TIME`, und`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)
}
```

Hier ist ein weiteres Beispiel, das zeigt, wie Sie das aktuelle Datum und die aktuelle Uhrzeit senden können:

```
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)}`)
}
```

**Verfügbare Typhinweise**
+ `typeHint.DATE`- Der entsprechende Parameter wird als Objekt des `DATE` Typs an die Datenbank gesendet. Das akzeptierte Format ist `YYYY-MM-DD`.
+ `typeHint.DECIMAL`- Der entsprechende Parameter wird als Objekt des `DECIMAL` Typs an die Datenbank gesendet.
+ `typeHint.JSON`- Der entsprechende Parameter wird als Objekt des `JSON` Typs an die Datenbank gesendet.
+ `typeHint.TIME`- Der entsprechende Zeichenkettenparameterwert wird als Objekt des `TIME` Typs an die Datenbank gesendet. Das akzeptierte Format ist `HH:MM:SS[.FFF]`. 
+ `typeHint.TIMESTAMP`- Der entsprechende Zeichenkettenparameterwert wird als Objekt des `TIMESTAMP` Typs an die Datenbank gesendet. Das akzeptierte Format ist `YYYY-MM-DD HH:MM:SS[.FFF]`.
+ `typeHint.UUID`- Der entsprechende Zeichenkettenparameterwert wird als Objekt des `UUID` Typs an die Datenbank gesendet.

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

Die `runtime` Bibliothek stellt Dienstprogramme zur Verfügung, mit denen Sie die Laufzeiteigenschaften Ihrer Resolver und Funktionen steuern oder ändern können.

## Liste der Runtime-Utils
<a name="runtime-utils-list-js"></a>

 **`runtime.earlyReturn(obj?: unknown, returnOptions?: {skipTo: 'END' | 'NEXT'}): never`**  
Wenn Sie diese Funktion aufrufen, wird die Ausführung des aktuellen Handlers, der AWS AppSync Funktion oder des Resolvers (Unit- oder Pipeline-Resolver) je nach aktuellem Kontext angehalten. Das angegebene Objekt wird als Ergebnis zurückgegeben.  
+ Beim Aufruf in einem AWS AppSync Funktionsanforderungshandler werden die Datenquelle und der Antworthandler übersprungen, und der nächste Funktionsanforderungshandler (oder der Antworthandler des Pipeline-Resolvers, falls dies die letzte AWS AppSync Funktion war) wird aufgerufen.
+ Beim Aufruf in einem AWS AppSync Pipeline-Resolver-Anforderungshandler wird die Pipeline-Ausführung übersprungen und der Pipeline-Resolver-Response-Handler wird sofort aufgerufen.
+ Wenn angegeben und der Wert auf „END“ `skipTo` gesetzt `returnOptions` ist, wird die Pipeline-Ausführung übersprungen und der Response-Handler für den Pipeline-Resolver wird sofort aufgerufen.
+ Wenn angegeben und auf „NEXT“ `skipTo` gesetzt `returnOptions` ist, wird die Funktionsausführung übersprungen und der nächste Pipeline-Handler aufgerufen.
**Beispiel**  

```
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
}
```

# Zeithelfer in util.time
<a name="time-helpers-in-util-time-js"></a>

Die `util.time`-Variable enthält "datetime"-Methoden, um beim Generieren von Zeitstempeln, Konvertieren zwischen "datetime"-Formaten und Parsen von "datetime"-Zeichenfolgen zu helfen. Die Syntax für Datetime-Formate basiert auf dieser Syntax [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html), auf die Sie für weitere Dokumentation verweisen können.

## Liste der Time-Utils
<a name="utility-helpers-in-time-list-js"></a>

 **`util.time.nowISO8601()`**  
Gibt eine String-Darstellung von UTC im [ISO8601Format](https://en.wikipedia.org/wiki/ISO_8601) zurück.

 **`util.time.nowEpochSeconds()`**  
Gibt die Anzahl der Sekunden aus der Epoche von 1970-01-01T00:00:00Z bis jetzt zurück.

 **`util.time.nowEpochMilliSeconds()`**  
Gibt die Anzahl der Millisekunden aus der Epoche von 1970-01-01T00:00:00Z bis jetzt zurück.

 **`util.time.nowFormatted(String)`**  
Gibt eine Zeichenfolge des aktuellen Zeitstempels in UTC unter Verwendung des angegebenen Formats aus einem Zeichenfolge-Eingabetyp zurück.

 **`util.time.nowFormatted(String, String)`**  
Gibt eine Zeichenfolge des aktuellen Zeitstempels aus einer Zeitzone unter Verwendung des angegebenen Formats und der Zeitzone aus Zeichenfolge-Eingabetypen zurück.

 **`util.time.parseFormattedToEpochMilliSeconds(String, String)`**  
Analysiert einen als String übergebenen Zeitstempel zusammen mit einem Format, das eine Zeitzone enthält, und gibt dann den Zeitstempel in Millisekunden seit der Epoche zurück.

 **`util.time.parseFormattedToEpochMilliSeconds(String, String, String)`**  
Analysiert einen als String übergebenen Zeitstempel zusammen mit einem Format und einer Zeitzone und gibt dann den Zeitstempel in Millisekunden seit der Epoche zurück.

 **`util.time.parseISO8601ToEpochMilliSeconds(String)`**  
Analysiert einen als String übergebenen Zeitstempel und gibt dann den ISO8601 Zeitstempel in Millisekunden seit der Epoche zurück.

 **`util.time.epochMilliSecondsToSeconds(long)`**  
Konvertiert einen Epoche-Millisekunden-Zeitstempel in einen Epoche-Sekunden-Zeitstempel.

 **`util.time.epochMilliSecondsToISO8601(long)`**  
Konvertiert einen Millisekunden-Zeitstempel einer Epoche in einen Zeitstempel. ISO8601

 **`util.time.epochMilliSecondsToFormatted(long, String)`**  
Konvertiert einen Epochen-Millisekunden-Zeitstempel, der als long übergeben wurde, in einen Zeitstempel, der gemäß dem angegebenen Format in UTC formatiert ist.

 **`util.time.epochMilliSecondsToFormatted(long, String, String)`**  
Konvertiert einen Epochen-Millisekunden-Zeitstempel, der als Long übergeben wurde, in einen Zeitstempel, der gemäß dem angegebenen Format in der angegebenen Zeitzone formatiert ist.

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

`util.dynamodb`enthält Hilfsmethoden, die das Schreiben und Lesen von Daten in Amazon DynamoDB erleichtern, z. B. automatische Typzuweisung und Formatierung. 

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

### Liste der ToDynamoDB-Dienstprogramme
<a name="utility-helpers-in-toDynamoDB-list-js"></a>

 **`util.dynamodb.toDynamoDB(Object)`**   
Allgemeines Objektkonvertierungstool für DynamoDB, das Eingabeobjekte in die entsprechende DynamoDB-Darstellung konvertiert. Es ist vorbestimmt, wie einige Typen dargestellt werden: z. B. werden Listen ("L") anstelle von Sätzen ("SS", "NS", "BS") verwendet. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  
**Beispiel für eine Zeichenfolge**  

```
Input:      util.dynamodb.toDynamoDB("foo")
Output:     { "S" : "foo" }
```
**Beispiel für eine Zahl**  

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

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

```
Input:      util.dynamodb.toDynamoDB([ "foo", 123, { "bar" : "baz" } ])
Output:     {
               "L" : [
                   { "S" : "foo" },
                   { "N" : 123 },
                   {
                       "M" : {
                           "bar" : { "S" : "baz" }
                       }
                   }
               ]
           }
```
**Beispiel für eine Karte**  

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

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

### Liste der ToString-Dienstprogramme
<a name="utility-helpers-in-toString-list-js"></a>

**`util.dynamodb.toString(String)`**  
Konvertiert eine Eingabezeichenfolge in das DynamoDB-Zeichenkettenformat. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

 **`util.dynamodb.toStringSet(List<String>)`**  
Konvertiert eine Liste mit Strings in das DynamoDB-Zeichenkettensatzformat. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

## ToNumber-Dienstprogramme
<a name="utility-helpers-in-toNumber-js"></a>

### Liste der ToNumber-Dienstprogramme
<a name="utility-helpers-in-toNumber-list-js"></a>

 **`util.dynamodb.toNumber(Number)`**  
Konvertiert eine Zahl in das DynamoDB-Zahlenformat. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

 **`util.dynamodb.toNumberSet(List<Number>)`**  
Konvertiert eine Liste von Zahlen in das DynamoDB-Nummernsatzformat. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

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

### Liste der ToBinary-Dienstprogramme
<a name="utility-helpers-in-toBinary-list-js"></a>

 **`util.dynamodb.toBinary(String)`**  
Konvertiert als Base64-Zeichenfolge kodierte Binärdaten in das DynamoDB-Binärformat. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

 **`util.dynamodb.toBinarySet(List<String>)`**  
Konvertiert eine Liste von Binärdaten, die als Base64-Zeichenfolgen kodiert sind, in das DynamoDB-Binärsatzformat. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

## ToBoolesche Hilfsprogramme
<a name="utility-helpers-in-toBoolean-js"></a>

### Liste der toBooleschen Dienstprogramme
<a name="utility-helpers-in-toBoolean-list-js"></a>

 **`util.dynamodb.toBoolean(Boolean)`**  
Konvertiert einen booleschen Wert in das entsprechende boolesche DynamoDB-Format. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

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

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

 **`util.dynamodb.toNull()`**  
Gibt eine Null im DynamoDB-Null-Format zurück. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

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

### Liste der ToList-Dienstprogramme
<a name="utility-helpers-in-toList-list-js"></a>

**`util.dynamodb.toList(List)`**  
Konvertiert eine Liste von Objekten in das DynamoDB-Listenformat. Jedes Element in der Liste wird auch in das entsprechende DynamoDB-Format konvertiert. Es ist vorbestimmt, wie einige verschachtelte Objekte dargestellt werden: z. B. werden Listen ("L") anstelle von Sätzen ("SS", "NS", "BS") verwendet. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

## ToMap-Dienstprogramme
<a name="utility-helpers-in-toMap-js"></a>

### Liste der ToMap-Dienstprogramme
<a name="utility-helpers-in-toMap-list-js"></a>

 **`util.dynamodb.toMap(Map)`**  
Konvertiert eine Map in das DynamoDB-Kartenformat. Jeder Wert in der Map wird ebenfalls in das entsprechende DynamoDB-Format konvertiert. Es ist vorbestimmt, wie einige verschachtelte Objekte dargestellt werden: z. B. werden Listen ("L") anstelle von Sätzen ("SS", "NS", "BS") verwendet. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

```
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)`**  
Erstellt eine Kopie der Map, in der jeder Wert in das entsprechende DynamoDB-Format konvertiert wurde. Es ist vorbestimmt, wie einige verschachtelte Objekte dargestellt werden: z. B. werden Listen ("L") anstelle von Sätzen ("SS", "NS", "BS") verwendet.  

```
Input:      util.dynamodb.toMapValues({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "foo"  : { "S" : "bar" },
               "baz"  : { "N" : 1234 },
               "beep" : {
                   "L" : [
                       { "S" : "boop" }
                   ]
               }
           }
```
Dies unterscheidet sich `util.dynamodb.toMap(Map)` geringfügig davon, dass nur der Inhalt des DynamoDB-Attributwerts zurückgegeben wird, nicht jedoch der gesamte Attributwert selbst. Die folgenden Aussagen sind beispielsweise identisch:  

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

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

### Liste der S3Object-Dienstprogramme
<a name="utility-helpers-in-S3Object-list-js"></a>

**`util.dynamodb.toS3Object(String key, String bucket, String region)`**  
Konvertiert den Schlüssel, den Bucket und die Region in die DynamoDB S3-Objektdarstellung. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

```
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)`**  
Konvertiert den Schlüssel, den Bucket, die Region und die optionale Version in die DynamoDB S3-Objektdarstellung. Dies gibt ein Objekt zurück, das den DynamoDB-Attributwert beschreibt.  

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

 **`util.dynamodb.fromS3ObjectJson(String)`**  
Akzeptiert den Zeichenkettenwert eines DynamoDB S3-Objekts und gibt eine Map zurück, die den Schlüssel, den Bucket, die Region und die optionale Version enthält.  

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

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

Das `util.http` Hilfsprogramm stellt Hilfsmethoden bereit, mit denen Sie HTTP-Anforderungsparameter verwalten und Antwortheader hinzufügen können.

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

 **`util.http.copyHeaders(headers)`**  
Kopiert die Header aus der Map, mit Ausnahme der folgenden eingeschränkten HTTP-Header:  
+ transfer-encoding
+ connection
+ host
+ expect
+ keep-alive
+ upgrade
+ proxy-authenticate
+ proxy-authorization
+ te
+ content-length

**`util.http.addResponseHeader(String, Object)`**  
Fügt einen einzelnen benutzerdefinierten Header mit dem Namen (`String`) und dem Wert (`Object`) der Antwort hinzu. Die folgenden Einschränkungen gelten:  
+ Zusätzlich zur Liste der eingeschränkten Header für `copyHeaders(headers)` dürfen Header-Namen keinem der folgenden Werte entsprechen:
  + 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
+ Headernamen dürfen nicht mit den eingeschränkten Präfixen `x-amzn-` oder beginnen. `x-amz-`
+ Die Größe der benutzerdefinierten Antwort-Header darf 4 KB nicht überschreiten. Dies schließt Header-Namen und -Werte ein.
+ Sie sollten jeden Antwortheader einmal pro GraphQL-Operation definieren. Wenn Sie jedoch mehrmals einen benutzerdefinierten Header mit demselben Namen definieren, erscheint die neueste Definition in der Antwort. Alle Header werden unabhängig von der Benennung auf die Größenbeschränkung für Header angerechnet.
+ Header mit einem leeren oder eingeschränkten Namen `(String)` oder einem Nullwert `(Object)` werden ignoriert und führen zu einem `ResponseHeaderError` Fehler, der zur Ausgabe des `errors` Vorgangs hinzugefügt wird.

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

**`util.http.addResponseHeaders(Map)`**  
Fügt der Antwort mehrere Antwort-Header aus der angegebenen Zuordnung von Namen `(String)` und Werten hinzu. `(Object)` Dieselben Einschränkungen, die für die `addResponseHeader(String, Object)` Methode aufgeführt sind, gelten auch für diese Methode.  

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

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

`util.transform`enthält Hilfsmethoden, die es einfacher machen, komplexe Operationen an Datenquellen durchzuführen.

## Liste der Hilfsprogramme für Transformationshelfer
<a name="transformation-helpers-in-utils-transform-js-list"></a>

**`util.transform.toDynamoDBFilterExpression(filterObject: DynamoDBFilterObject) : string`**  
Konvertiert eine Eingabezeichenfolge in einen Filterausdruck zur Verwendung mit DynamoDB. Wir empfehlen die Verwendung `toDynamoDBFilterExpression` mit [integrierten Modulfunktionen](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-modules-js.html).

**`util.transform.toElasticsearchQueryDSL(object: OpenSearchQueryObject) : string`**  
Konvertiert die angegebene Eingabe in den entsprechenden OpenSearch Query-DSL-Ausdruck und gibt sie als JSON-Zeichenfolge zurück.  
**Beispieleingabe:**  

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

```
{
    "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"
                    }
                  }
              ]
            }
          }
      ]
    }
}
```
Es wird angenommen, dass der Standardoperator AND ist.

**`util.transform.toSubscriptionFilter(objFilter, ignoredFields?, rules?): SubscriptionFilter`**  
Konvertiert ein `Map` Eingabeobjekt in ein `SubscriptionFilter` Ausdrucksobjekt. Die `util.transform.toSubscriptionFilter` Methode wird als Eingabe für die `extensions.setSubscriptionFilter()` Erweiterung verwendet. Weitere Informationen finden Sie unter [Erweiterungen](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html).  
Die Parameter und die Rückgabeanweisung sind unten aufgeführt:  
*Parameter*  
+ `objFilter`: `SubscriptionFilterObject`

  Ein `Map` Eingabeobjekt, das in das `SubscriptionFilter` Ausdrucksobjekt konvertiert wurde.
+ `ignoredFields`: `SubscriptionFilterExcludeKeysType` (optional)

  Eine `List` der Feldnamen im ersten Objekt, die ignoriert werden.
+ `rules`: `SubscriptionFilterRuleObject` (optional)

  Ein `Map` Eingabeobjekt mit strengen Regeln, das bei der Konstruktion des `SubscriptionFilter` Ausdrucksobjekts berücksichtigt wird. Diese strengen Regeln werden in das `SubscriptionFilter` Ausdrucksobjekt aufgenommen, sodass mindestens eine der Regeln erfüllt ist, um den Abonnementfilter zu bestehen.
*Antwort*  
Gibt eine `[SubscriptionFilter](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html)` zurück.

**`util.transform.toSubscriptionFilter(Map, List)`**  
Konvertiert ein `Map` Eingabeobjekt in ein `SubscriptionFilter` Ausdrucksobjekt. Die `util.transform.toSubscriptionFilter` Methode wird als Eingabe für die `extensions.setSubscriptionFilter()` Erweiterung verwendet. Weitere Informationen finden Sie unter [Erweiterungen](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html).  
Das erste Argument ist das `Map` Eingabeobjekt, das in das `SubscriptionFilter` Ausdrucksobjekt konvertiert wurde. Das zweite Argument besteht `List` aus Feldnamen, die im ersten `Map` Eingabeobjekt bei der Konstruktion des `SubscriptionFilter` Ausdrucksobjekts ignoriert werden.

**`util.transform.toSubscriptionFilter(Map, List, Map)`**  
Konvertiert ein `Map` Eingabeobjekt in ein `SubscriptionFilter` Ausdrucksobjekt. Die `util.transform.toSubscriptionFilter` Methode wird als Eingabe für die `extensions.setSubscriptionFilter()` Erweiterung verwendet. Weitere Informationen finden Sie unter [Erweiterungen](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html). 

**`util.transform.toDynamoDBConditionExpression(conditionObject)`**  
Erstellt einen DynamoDB-Bedingungsausdruck.

## Argumente für den Abonnementfilter
<a name="subscription-filter-arguments-js"></a>

In der folgenden Tabelle wird erklärt, wie die Argumente der folgenden Dienstprogramme definiert sind:
+ `Util.transform.toSubscriptionFilter(objFilter, ignoredFields?, rules?): SubscriptionFilter`

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

Argument 1 ist ein `Map` Objekt mit den folgenden Schlüsselwerten:
+ Feldnamen
+ „und“
+ „oder“

Bei Feldnamen als Schlüssel haben die Bedingungen für die Einträge dieser Felder die Form von`"operator" : "value"`. 

Das folgende Beispiel zeigt, wie Einträge hinzugefügt werden können: `Map`

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

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

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

Wenn ein Feld zwei oder mehr Bedingungen enthält, wird davon ausgegangen, dass alle diese Bedingungen die OR-Operation verwenden.

Die Eingabe `Map` kann auch „und“ und „oder“ als Schlüssel enthalten, was bedeutet, dass alle darin enthaltenen Einträge je nach Schlüssel mit DER UND- oder OR-Logik verknüpft werden sollten. Die Schlüsselwerte „und“ und „oder“ erwarten eine Reihe von Bedingungen.

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

Beachten Sie, dass Sie „und“ und „oder“ verschachteln können. Das heißt, Sie können „und“ /"oder“ innerhalb eines anderen „und“ /"oder“ -Blocks verschachtelt haben. Dies funktioniert jedoch nicht für einfache Felder.

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

Das folgende Beispiel zeigt eine Eingabe von *Argument 1* mit`util.transform.toSubscriptionFilter(Map) : Map`.

**Eingabe (en)**

Argument 1: Karte:

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

**Ausgabe**

Das Ergebnis ist ein `Map` Objekt:

```
{
  "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 ]

Argument 2 enthält eine Reihe `List` von Feldnamen, die bei der Erstellung des `SubscriptionFilter` Ausdrucksobjekts nicht in der Eingabe `Map` (Argument 1) berücksichtigt werden sollten. Das `List` kann auch leer sein.

Das folgende Beispiel zeigt die Eingaben von Argument 1 und Argument 2 mit`util.transform.toSubscriptionFilter(Map, List) : Map`.

**Eingabe (en)**

Argument 1: Karte:

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

Argument 2: Liste:

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

**Ausgabe**

Das Ergebnis ist ein `Map` Objekt:

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

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

Argument 3 ist ein `Map` Objekt, das Feldnamen als Schlüsselwerte hat (darf nicht „und“ oder „oder“ enthalten). Bei Feldnamen als Schlüssel handelt es sich bei den Bedingungen für diese Felder um Einträge in der Form von`"operator" : "value"`. Im Gegensatz zu Argument 1 kann Argument 3 nicht mehrere Bedingungen in demselben Schlüssel haben. Darüber hinaus hat Argument 3 keine „Und“ - oder „Oder“ -Klausel, sodass auch keine Verschachtelung erforderlich ist.

Argument 3 stellt eine Liste strenger Regeln dar, die dem `SubscriptionFilter` Ausdrucksobjekt hinzugefügt werden, sodass **mindestens eine** dieser Bedingungen erfüllt ist, um den Filter zu bestehen.

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

Das folgende Beispiel zeigt die Eingaben von *Argument 1*, *Argument 2* und *Argument 3* mithilfe von`util.transform.toSubscriptionFilter(Map, List, Map) : Map`.

**Eingabe (en)**

Argument 1: Karte:

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

Argument 2: Liste:

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

Argument 3: Karte:

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

**Ausgabe**

Das Ergebnis ist ein `Map` Objekt:

```
{
  "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"
        }
      ]
    }
  ]
}
```

------

# Zeichenketten-Helfer in util.str
<a name="str-helpers-in-util-str-js"></a>

 `util.str`enthält Methoden, die bei gängigen String-Operationen helfen. 

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

 **`util.str.normalize(String, String)`**  
Normalisiert eine Zeichenfolge mit einer der vier Unicode-Normalisierungsformen: NFC, NFD, NFKC oder NFKD. Das erste Argument ist die zu normalisierende Zeichenfolge. Das zweite Argument ist entweder „nfc“, „nfd“, „nfkc“ oder „nfkd“ und gibt den Normalisierungstyp an, der für den Normalisierungsprozess verwendet werden soll.

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

`extensions`enthält eine Reihe von Methoden, mit denen Sie zusätzliche Aktionen in Ihren Resolvern ausführen können.

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

**`extensions.evictFromApiCache(typeName: string, fieldName: string, keyValuePair: Record<string, any>) : Object`**  
Löscht ein Element aus dem serverseitigen AWS AppSync Cache. Das erste Argument ist der Typname. Das zweite Argument ist der Feldname. Das dritte Argument ist ein Objekt, das Schlüssel-Wert-Paar-Elemente enthält, die den Zwischenspeicher-Schlüsselwert angeben. Sie müssen die Elemente im Objekt in derselben Reihenfolge platzieren wie die Caching-Schlüssel in den zwischengespeicherten Resolvern. `cachingKey` [Weitere Informationen zum Zwischenspeichern finden Sie unter Caching-Verhalten.](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html#caching-behavior)  
**Beispiel 1:**  
In diesem Beispiel werden die Elemente entfernt, die für einen aufgerufenen Resolver zwischengespeichert wurden, für den ein aufgerufener `Query.allClasses` Caching-Schlüssel verwendet wurde. `context.arguments.semester` Wenn die Mutation aufgerufen wird und der Resolver ausgeführt wird und ein Eintrag erfolgreich gelöscht wurde, enthält die Antwort einen `apiCacheEntriesDeleted` Wert im Erweiterungsobjekt, der angibt, wie viele Einträge gelöscht wurden.  

```
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;
}
```
Diese Funktion funktioniert **nur** für Mutationen, nicht für Abfragen.

## Abonnement-Erweiterungen
<a name="subscription-extensions-js-list"></a>

**`extensions.setSubscriptionFilter(filterJsonObject)`**  
Definiert erweiterte Abonnementfilter. Jedes Abonnementbenachrichtigungsereignis wird anhand der bereitgestellten Abonnementfilter bewertet und sendet Benachrichtigungen an Kunden, wenn alle Filter als erfüllt gelten`true`. Das Argument ist `filterJsonObject` (Weitere Informationen zu diesem Argument finden Sie weiter unten im filterJsonObject Abschnitt *Argument:*.). Siehe [Verbesserte Abonnementfilterung](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html).  
Sie können diese Erweiterungsfunktion nur im Antworthandler eines Abonnement-Resolvers verwenden. Außerdem empfehlen wir die Verwendung, `util.transform.toSubscriptionFilter` um Ihren Filter zu erstellen.

**`extensions.setSubscriptionInvalidationFilter(filterJsonObject)`**  
Definiert Filter für die Invalidierung von Abonnements. Abonnementfilter werden anhand der Payload für die Invalidierung bewertet und machen dann ein bestimmtes Abonnement ungültig, wenn die Filter Folgendes ergeben. `true` Das Argument ist `filterJsonObject` (Weitere Informationen zu diesem Argument finden Sie weiter unten im filterJsonObject Abschnitt *Argument:*.). Siehe [Verbesserte Abonnementfilterung](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html).  
Sie können diese Erweiterungsfunktion nur im Antworthandler eines Abonnement-Resolvers verwenden. Außerdem empfehlen wir die Verwendung, `util.transform.toSubscriptionFilter` um Ihren Filter zu erstellen.

**`extensions.invalidateSubscriptions(invalidationJsonObject)`**  
Wird verwendet, um die Invalidierung eines Abonnements aufgrund einer Mutation einzuleiten. Das Argument lautet `invalidationJsonObject` (Weitere Informationen zu diesem Argument finden Sie weiter unten im invalidationJsonObject Abschnitt *Argument:*.).  
Diese Erweiterung kann nur in den Response-Mapping-Vorlagen der Mutationsresolver verwendet werden.  
Sie können in einer einzelnen Anfrage nur maximal fünf eindeutige `extensions.invalidateSubscriptions()` Methodenaufrufen verwenden. Wenn Sie dieses Limit überschreiten, erhalten Sie einen GraphQL-Fehler.

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

Das JSON-Objekt definiert entweder Abonnement- oder Invalidierungsfilter. Es ist eine Reihe von Filtern in einem`filterGroup`. Jeder Filter ist eine Sammlung einzelner Filter.

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

Jeder Filter hat drei Attribute: 
+ `fieldName`— Das GraphQL-Schemafeld.
+ `operator`— Der Operatortyp.
+ `value`— Die Werte, die mit dem `fieldName` Wert der Abonnementbenachrichtigung verglichen werden sollen.

Im Folgenden finden Sie ein Beispiel für die Zuweisung dieser Attribute:

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

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

Das `invalidationJsonObject` definiert Folgendes:
+ `subscriptionField`— Das GraphQL-Schemaabonnement, das ungültig werden soll. Ein einzelnes Abonnement, das als Zeichenfolge in der definiert ist`subscriptionField`, wird für ungültig erklärt.
+ `payload`— Eine Liste mit Schlüssel-Wert-Paaren, die als Eingabe für die Ungültigerklärung von Abonnements verwendet wird, wenn der Invalidierungsfilter A anhand ihrer Werte auswertet. `true`

  Im folgenden Beispiel werden abonnierte und verbundene Clients, die das Abonnement verwenden, ungültig gemacht, wenn der im `onUserDelete` Abonnement-Resolver definierte Invalidierungsfilter das Ergebnis anhand des Werts auswertet. `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;
  }
  ```

# XML-Hilfsprogramme in util.xml
<a name="xml-helpers-in-util-xml-js"></a>

 `util.xml`enthält Methoden, die bei der Konvertierung von XML-Zeichenketten helfen. 

## Liste der Dienstprogramme von util.xml
<a name="xml-helpers-in-util-xml-list-js"></a>

 **`util.xml.toMap(String) : Object`**  
Konvertiert eine XML-Zeichenfolge in ein Wörterbuch.  
**Beispiel 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"
      }
    }
}
```
**Beispiel 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`**  
Konvertiert eine XML-Zeichenfolge in eine JSON-Zeichenfolge. Dies ist ähnlich`toMap`, außer dass die Ausgabe eine Zeichenfolge ist. Dies ist nützlich, wenn Sie direkt umwandeln und die XML-Antwort aus einem HTTP-Objekt an JSON zurückgeben. Sie können einen optionalen booleschen Parameter festlegen, um zu bestimmen, ob Sie den JSON als Zeichenfolge kodieren möchten.

# AWS AppSync JavaScript Resolver-Funktionsreferenz für DynamoDB
<a name="js-resolver-reference-dynamodb"></a>

Mit der AWS AppSync DynamoDB-Funktion können Sie [GraphQL](https://graphql.org) verwenden, um Daten in vorhandenen Amazon DynamoDB-Tabellen in Ihrem Konto zu speichern und abzurufen, indem Sie eine eingehende GraphQL-Anfrage einem DynamoDB-Aufruf zuordnen und dann die DynamoDB-Antwort wieder GraphQL zuordnen. In diesem Abschnitt werden die Anforderungs- und Antworthandler für unterstützte DynamoDB-Operationen beschrieben:
+  [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-getitem.html)- Mit der GetItem Anfrage können Sie die DynamoDB-Funktion anweisen, eine GetItem Anfrage an DynamoDB zu stellen, und Sie können den Schlüssel des Elements in DynamoDB angeben und angeben, ob ein konsistenter Lesevorgang verwendet werden soll oder nicht.
+  [ PutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-putitem.html)- Mit dem PutItem Anforderungszuordnungsdokument können Sie die DynamoDB-Funktion anweisen, eine PutItem Anfrage an DynamoDB zu stellen, und Sie können den Schlüssel des Elements in DynamoDB, den vollständigen Inhalt des Elements (bestehend aus Schlüssel und AttributeValues) und Bedingungen für den Erfolg des Vorgangs angeben.
+  [ UpdateItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-updateitem.html)- Mit der UpdateItem Anforderung können Sie die DynamoDB-Funktion anweisen, eine UpdateItem Anfrage an DynamoDB zu stellen, und Sie können den Schlüssel des Elements in DynamoDB, einen Aktualisierungsausdruck, der beschreibt, wie das Element in DynamoDB aktualisiert wird, und die Bedingungen für den Erfolg des Vorgangs angeben.
+  [ DeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-deleteitem.html)- Mit der DeleteItem Anfrage können Sie die DynamoDB-Funktion anweisen, eine DeleteItem Anfrage an DynamoDB zu stellen, und Sie können den Schlüssel des Elements in DynamoDB und die Bedingungen für den Erfolg des Vorgangs angeben.
+  [Abfrage](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-query.html) — Mit dem Query-Anforderungsobjekt können Sie den DynamoDB-Resolver anweisen, eine Abfrageanforderung an DynamoDB zu stellen, und Sie können den Schlüsselausdruck, den zu verwendenden Index, zusätzliche Filter, die Anzahl der zurückzugebenden Elemente, die Verwendung konsistenter Lesevorgänge, die Abfragerichtung (vorwärts oder rückwärts) und Paginierungstoken angeben.
+  [Scan](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-scan.html) — Mit der Scananforderung können Sie die DynamoDB-Funktion anweisen, eine Scananforderung an DynamoDB zu stellen, und Sie können einen Filter angeben, um Ergebnisse auszuschließen, welcher Index verwendet werden soll, wie viele Elemente zurückgegeben werden sollen, ob konsistente Lesevorgänge, Paginierungstoken und parallel Scans verwendet werden sollen.
+  [Sync](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-sync.html) — Mit dem Sync-Anforderungsobjekt können Sie alle Ergebnisse aus einer DynamoDB-Tabelle abrufen und anschließend nur die Daten empfangen, die seit Ihrer letzten Abfrage geändert wurden (die Delta-Updates). Synchronisierungsanforderungen können nur an versionierte DynamoDB-Datenquellen gestellt werden. Sie können einen Filter angeben, um Ergebnisse, die Anzahl der zurückzugebenden Elemente, die Paginierungstoken und den Zeitpunkt, an dem Ihr letzter Synchronisierungsvorgang gestartet wurde, auszuschließen.
+  [ BatchGetItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-get-item.html)- Mit dem BatchGetItem Anforderungsobjekt können Sie die DynamoDB-Funktion anweisen, eine BatchGetItem Anforderung an DynamoDB zu stellen, um mehrere Elemente abzurufen, möglicherweise über mehrere Tabellen hinweg. Für dieses Anforderungsobjekt müssen Sie die Tabellennamen angeben, aus denen die Elemente abgerufen werden sollen, und die Schlüssel der Elemente, die aus jeder Tabelle abgerufen werden sollen.
+  [ BatchDeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-delete-item.html)- Mit dem BatchDeleteItem Anforderungsobjekt können Sie die DynamoDB-Funktion anweisen, eine BatchWriteItem Anforderung an DynamoDB zu stellen, um mehrere Elemente zu löschen, möglicherweise über mehrere Tabellen hinweg. Für dieses Anforderungsobjekt müssen Sie die Tabellennamen angeben, aus denen die Elemente gelöscht werden sollen, und die Schlüssel der Elemente, die aus jeder Tabelle gelöscht werden sollen.
+  [ BatchPutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-put-item.html)- Mit dem BatchPutItem Anforderungsobjekt können Sie die DynamoDB-Funktion anweisen, eine BatchWriteItem Anforderung an DynamoDB zu stellen, um mehrere Elemente zu platzieren, möglicherweise in mehreren Tabellen. Für dieses Anforderungsobjekt müssen Sie die Tabellennamen angeben, in die die Elemente eingefügt werden sollen, und die vollständigen Elemente, die in jede Tabelle eingefügt werden sollen.
+  [ TransactGetItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-get-items.html)- Mit dem TransactGetItems Anforderungsobjekt können Sie die DynamoDB-Funktion anweisen, eine TransactGetItems Anforderung an DynamoDB zu stellen, um mehrere Elemente abzurufen, möglicherweise über mehrere Tabellen hinweg. Für dieses Anforderungsobjekt müssen Sie den Tabellennamen jedes Anforderungselements angeben, aus dem das Element abgerufen werden soll, und den Schlüssel jedes Anforderungselements, das aus jeder Tabelle abgerufen werden soll.
+  [ TransactWriteItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-write-items.html)- Mit dem TransactWriteItems Anforderungsobjekt können Sie die DynamoDB-Funktion anweisen, eine TransactWriteItems Anforderung an DynamoDB zu stellen, um mehrere Elemente zu schreiben, möglicherweise in mehrere Tabellen. Für dieses Anforderungsobjekt müssen Sie den Zieltabellennamen jedes Anforderungselements, die Operation jedes auszuführenden Anforderungselements und den Schlüssel jedes zu schreibenden Anforderungselements angeben.
+  [Typsystem (Anforderungszuordnung)](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-typed-values-request.html) — Erfahren Sie mehr darüber, wie DynamoDB-Typisierung in Anfragen integriert AWS AppSync wird.
+  [Typsystem (Antwortzuordnung)](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-typed-values-responses.html) — Erfahren Sie mehr darüber, wie DynamoDB-Typen in einer Antwortnutzlast automatisch in GraphQL oder JSON konvertiert werden.
+  [Filter](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-filter.html) — Erfahren Sie mehr über Filter für Abfrage- und Scanvorgänge.
+  [Bedingungsausdrücke](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-condition-expressions.html) — Erfahren Sie mehr über Bedingungsausdrücke für PutItem UpdateItem, und DeleteItem Operationen.
+  [Ausdrücke für Transaktionsbedingungen](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions.html) — Erfahren Sie mehr über Bedingungsausdrücke für TransactWriteItems Operationen.
+  [Projektionen](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-projections.html) — Erfahren Sie mehr darüber, wie Sie Attribute bei Lesevorgängen angeben.

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

Mit der `GetItem` Anfrage können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `GetItem` Anfrage an DynamoDB zu stellen, und Sie können Folgendes angeben:
+ Der Schlüssel des Elements in DynamoDB
+ Ob ein Consistent-Lesevorgang verwendet wird oder nicht

Die `GetItem` Anfrage hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### GetItem Liste der Felder
<a name="js-getitem-list-col"></a>

 **`operation`**   
Der DynamoDB DynamoDB-Vorgang. Um die `GetItem`-DynamoDB-Operation durchzuführen, muss diese auf `GetItem` gesetzt sein. Dieser Wert ist erforderlich.

 **`key`**   
Der Schlüssel des Elements in DynamoDB. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser Wert ist erforderlich.

 **`consistentRead`**   
Ob ein stark konsistenter Lesevorgang mit DynamoDB durchgeführt werden soll oder nicht. Dieser Schritt ist optional und standardmäßig auf `false` gesetzt.

**`projection`**  
Eine Projektion, die verwendet wird, um die Attribute anzugeben, die von der DynamoDB-Operation zurückgegeben werden sollen. [Weitere Informationen zu Projektionen finden Sie unter Projektionen.](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections) Dies ist ein optionales Feld.

Das von DynamoDB zurückgegebene Element wird automatisch in primitive GraphQL- und JSON-Typen konvertiert und ist im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Abfrage`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
  }
}
```

Weitere Informationen zur DynamoDB `GetItem`-API finden Sie in der [DynamoDB API-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html).

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

Mit dem `PutItem` Anforderungszuordnungsdokument können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `PutItem` Anfrage an DynamoDB zu stellen, und Sie können Folgendes angeben:
+ Der Schlüssel des Elements in DynamoDB
+ Der vollständige Inhalt des Elements (bestehend aus `key` und `attributeValues`)
+ Bedingungen, damit die Operation erfolgreich ausgeführt werden kann

Die `PutItem` Anfrage hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### PutItem Liste der Felder
<a name="js-putitem-list-col"></a>

 **`operation`**   
Der DynamoDB DynamoDB-Vorgang. Um die `PutItem`-DynamoDB-Operation durchzuführen, muss diese auf `PutItem` gesetzt sein. Dieser Wert ist erforderlich.

 **`key`**   
Der Schlüssel des Elements in DynamoDB. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser Wert ist erforderlich.

 **`attributeValues`**   
Der Rest der Attribute des Elements, die in DynamoDB gespeichert werden sollen. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dies ist ein optionales Feld.

 **`condition`**   
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Wenn keine Bedingung angegeben ist, überschreibt die `PutItem`-Anforderung alle vorhandenen Einträge für dieses Element. Weitere Informationen zu Bedingungen finden Sie unter [Bedingungsausdrücke](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Dieser Wert ist optional.

 **`_version`**   
Ein numerischer Wert, der die neueste bekannte Version eines Elements darstellt. Dieser Wert ist optional. Dieses Feld wird für die *Konflikterkennung* verwendet und nur für versionsgesteuerte Datenquellen unterstützt.

**`customPartitionKey`**  
Wenn diese Option aktiviert ist, ändert dieser Zeichenfolgenwert das Format der `ds_sk` und `ds_pk` -Datensätze, die von der Delta-Synchronisierungstabelle verwendet werden, wenn die Versionierung aktiviert wurde (weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*). Wenn diese Option aktiviert ist, ist auch die Verarbeitung des `populateIndexFields` Eintrags aktiviert. Dies ist ein optionales Feld.

**`populateIndexFields`**  
Ein boolescher Wert, der, wenn er **zusammen mit dem** aktiviert wird`customPartitionKey`, neue Einträge für jeden Datensatz in der Delta-Synchronisierungstabelle erstellt, insbesondere in den Spalten `gsi_ds_pk` und`gsi_ds_sk`. Weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*. Dies ist ein optionales Feld.   
Das in DynamoDB geschriebene Element wird automatisch in primitive GraphQL- und JSON-Typen konvertiert und ist im Kontext result () verfügbar. `context.result`

Das in DynamoDB geschriebene Element wird automatisch in primitive GraphQL- und JSON-Typen konvertiert und ist im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Mutation`updateThing(foo: String!, bar: String!, name: String!, version: Int!)`.

Wenn kein Element mit dem angegebenen Schlüssel vorhanden ist, wird es erstellt. Wenn ein Element mit dem angegebenen Schlüssel bereits vorhanden ist, wird es überschrieben.

```
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),
  };
}
```

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Mutation`updateThing(foo: String!, bar: String!, name: String!, expectedVersion: Int!)`.

In diesem Beispiel wird überprüft, ob für das Element, das sich derzeit in DynamoDB befindet, das `version` Feld auf gesetzt ist. `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,
  };
}
```

Weitere Informationen zur DynamoDB `PutItem`-API finden Sie in der [DynamoDB API-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html).

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

Mit der `UpdateItem` Anfrage können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `UpdateItem` Anfrage an DynamoDB zu stellen, und Sie können Folgendes angeben:
+ Der Schlüssel des Elements in DynamoDB
+ Ein Aktualisierungsausdruck, der beschreibt, wie das Element in DynamoDB aktualisiert wird
+ Bedingungen, damit die Operation erfolgreich ausgeführt werden kann

Die `UpdateItem` Anfrage hat die folgende Struktur:

```
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;
};
```

Die Felder sind wie folgt definiert:

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

### UpdateItem Liste der Felder
<a name="js-updateitem-list-col"></a>

 **`operation`**   
Der DynamoDB DynamoDB-Vorgang. Um die `UpdateItem`-DynamoDB-Operation durchzuführen, muss diese auf `UpdateItem` gesetzt sein. Dieser Wert ist erforderlich.

 **`key`**   
Der Schlüssel des Elements in DynamoDB. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Hinweise zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Dieser Wert ist erforderlich.

 **`update`**   
`update`In diesem Abschnitt können Sie einen Aktualisierungsausdruck angeben, der beschreibt, wie das Element in DynamoDB aktualisiert wird. Weitere Informationen zum Schreiben von Aktualisierungsausdrücken finden Sie in der [DynamoDB-Dokumentation UpdateExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Dieser Abschnitt ist erforderlich.  
Der `update`-Abschnitt enthält drei Komponenten:    
** `expression` **  
Den Aktualisierungsausdruck. Dieser Wert ist erforderlich.  
** `expressionNames` **  
Die Ersetzungen für Platzhalter der *Namen* von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Namensplatzhalter`expression`, der in der verwendet wird, und der Wert muss eine Zeichenfolge sein, die dem Attributnamen des Elements in DynamoDB entspricht. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Namen von Ausdrucksattributen gefüllt sein, die im `expression` verwendet werden.  
** `expressionValues` **  
Die Ersetzungen für Platzhalter der *Werte* von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Wertplatzhalter, der im `expression` verwendet wird, und der Wert muss ein typisierter Wert sein. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)Anforderungszuordnung). Dieser muss angegeben werden. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Werte von Ausdrucksattributen gefüllt sein, die im `expression` verwendet werden.

 **`condition`**   
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Wenn keine Bedingung angegeben ist, aktualisiert die `UpdateItem`-Anforderung jeden vorhandenen Eintrag unabhängig vom aktuellen Status. Weitere Informationen zu Bedingungen finden Sie unter [Bedingungsausdrücke](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Dieser Wert ist optional.

 **`_version`**   
Ein numerischer Wert, der die neueste bekannte Version eines Elements darstellt. Dieser Wert ist optional. Dieses Feld wird für die *Konflikterkennung* verwendet und nur für versionsgesteuerte Datenquellen unterstützt.

**`customPartitionKey`**  
Wenn diese Option aktiviert ist, ändert dieser Zeichenfolgenwert das Format der `ds_sk` und `ds_pk` -Datensätze, die von der Delta-Synchronisierungstabelle verwendet werden, wenn die Versionierung aktiviert wurde (weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*). Wenn diese Option aktiviert ist, ist auch die Verarbeitung des `populateIndexFields` Eintrags aktiviert. Dies ist ein optionales Feld.

**`populateIndexFields`**  
Ein boolescher Wert, der, wenn er **zusammen mit dem** aktiviert wird`customPartitionKey`, neue Einträge für jeden Datensatz in der Delta-Synchronisierungstabelle erstellt, insbesondere in den Spalten `gsi_ds_pk` und`gsi_ds_sk`. Weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*. Dies ist ein optionales Feld.

Das in DynamoDB aktualisierte Element wird automatisch in primitive GraphQL- und JSON-Typen konvertiert und ist im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für die GraphQL-Mutation`upvote(id: ID!)`.

In diesem Beispiel werden die `version` Felder `upvotes` und eines Elements in DynamoDB um 1 erhöht.

```
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 } },
    },
  };
}
```

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Mutation`updateItem(id: ID!, title: String, author: String, expectedVersion: Int!)`.

Hierbei handelt es sich um ein komplexes Beispiel, das die Argumente prüft und den Aktualisierungsausdruck dynamisch generiert, der nur die Argumente enthält, die vom Client bereitgestellt wurden. Beispiel: Wenn `title` und `author` nicht angegeben werden, werden sie nicht aktualisiert. Wenn ein Argument angegeben ist, sein Wert jedoch angegeben ist`null`, wird dieses Feld aus dem Objekt in DynamoDB gelöscht. Schließlich hat der Vorgang eine Bedingung, die überprüft, ob für das Element, das sich derzeit in DynamoDB befindet, das `version` Feld wie folgt gesetzt ist: `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),
    },
  };
}
```

Weitere Informationen zur DynamoDB `UpdateItem`-API finden Sie in der [DynamoDB API-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html).

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

Mit der `DeleteItem` Anfrage können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `DeleteItem` Anfrage an DynamoDB zu stellen, und Sie können Folgendes angeben:
+ Der Schlüssel des Elements in DynamoDB
+ Bedingungen, damit die Operation erfolgreich ausgeführt werden kann

Die `DeleteItem` Anfrage hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### DeleteItem Liste der Felder
<a name="js-deleteitem-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `DeleteItem`-DynamoDB-Operation durchzuführen, muss diese auf `DeleteItem` gesetzt sein. Dieser Wert ist erforderlich.

** `key` **  
Der Schlüssel des Elements in DynamoDB. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Hinweise zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request). Dieser Wert ist erforderlich.

** `condition` **  
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Wenn keine Bedingung angegeben ist, löscht die `DeleteItem`-Anforderung ein Element unabhängig vom aktuellen Status. Weitere Informationen zu Bedingungen finden Sie unter [Bedingungsausdrücke](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Dieser Wert ist optional.

** `_version` **  
Ein numerischer Wert, der die neueste bekannte Version eines Elements darstellt. Dieser Wert ist optional. Dieses Feld wird für die *Konflikterkennung* verwendet und nur für versionsgesteuerte Datenquellen unterstützt.

**`customPartitionKey`**  
Wenn diese Option aktiviert ist, ändert dieser Zeichenfolgenwert das Format der `ds_sk` und `ds_pk` -Datensätze, die von der Delta-Synchronisierungstabelle verwendet werden, wenn die Versionierung aktiviert wurde (weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*). Wenn diese Option aktiviert ist, ist auch die Verarbeitung des `populateIndexFields` Eintrags aktiviert. Dies ist ein optionales Feld.

**`populateIndexFields`**  
Ein boolescher Wert, der, wenn er **zusammen mit dem** aktiviert wird`customPartitionKey`, neue Einträge für jeden Datensatz in der Delta-Synchronisierungstabelle erstellt, insbesondere in den Spalten `gsi_ds_pk` und`gsi_ds_sk`. Weitere Informationen finden Sie unter [Konflikterkennung und -synchronisierung](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) im *AWS AppSync Entwicklerhandbuch*. Dies ist ein optionales Feld. 

Das aus DynamoDB gelöschte Element wird automatisch in primitive GraphQL- und JSON-Typen konvertiert und ist im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Mutation`deleteItem(id: ID!)`. Wenn ein Element mit dieser ID vorhanden ist, wird es gelöscht.

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

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Mutation`deleteItem(id: ID!, expectedVersion: Int!)`. Wenn ein Element mit dieser ID vorhanden ist, wird es nur dann gelöscht, wenn das `version`-Feld auf `expectedVersion` gesetzt ist:

```
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),
  };
}
```

Weitere Informationen zur DynamoDB `DeleteItem`-API finden Sie in der [DynamoDB API-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html).

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

Mit dem `Query` Anforderungsobjekt können Sie den AWS AppSync DynamoDB-Resolver anweisen, eine `Query` Anfrage an DynamoDB zu stellen, und Sie können Folgendes angeben:
+ Schlüsselausdruck
+ Welcher Index verwendet werden soll
+ Jeder zusätzliche Filter
+ Wie viele Elemente zurückgegeben werden sollen
+ Ob Consistent-Lesevorgänge verwendet werden sollen
+ Abfragerichtung (vorwärts oder rückwärts)
+ Paginierungs-Token

Das `Query` Anforderungsobjekt hat die folgende Struktur:

```
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 };
  };
};
```

Die Felder sind wie folgt definiert:

## Felder abfragen
<a name="js-query-list"></a>

### Liste der Abfragefelder
<a name="js-query-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `Query`-DynamoDB-Operation durchzuführen, muss diese auf `Query` gesetzt sein. Dieser Wert ist erforderlich.

** `query` **  
`query`In diesem Abschnitt können Sie einen Schlüsselbedingungsausdruck angeben, der beschreibt, welche Elemente aus DynamoDB abgerufen werden sollen. Weitere Informationen zum Schreiben von Ausdrücken für Schlüsselbedingungen finden Sie in der [DynamoDB-Dokumentation KeyConditions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html). Dieser Abschnitt muss angegeben werden.    
** `expression` **  
Der Abfrageausdruck. Dieses Feld muss angegeben werden.  
** `expressionNames` **  
Die Ersetzungen für Platzhalter der *Namen* von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Namensplatzhalter`expression`, der in der verwendet wird, und der Wert muss eine Zeichenfolge sein, die dem Attributnamen des Elements in DynamoDB entspricht. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Namen von Ausdrucksattributen gefüllt sein, die im `expression` verwendet werden.  
** `expressionValues` **  
Die Ersetzungen für Platzhalter der *Werte* von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Wertplatzhalter, der im `expression` verwendet wird, und der Wert muss ein typisierter Wert sein. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)Anforderungszuordnung). Dieser Wert ist erforderlich. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Werte von Ausdrucksattributen gefüllt sein, die im `expression` verwendet werden.

** `filter` **  
Ein zusätzlicher Filter, der für das Filtern der Ergebnisse von DynamoDB verwendet werden kann, bevor sie zurückgegeben werden. Weitere Informationen zu Filtern finden Sie unter [Filter](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Dies ist ein optionales Feld.

** `index` **  
Der Name des abzufragenden Indexes. Der DynamoDB-Abfragevorgang ermöglicht es Ihnen, zusätzlich zum Primärschlüsselindex auch lokale sekundäre Indizes und globale sekundäre Indizes nach einem Hashschlüssel zu durchsuchen. Falls angegeben, weist dies DynamoDB an, den angegebenen Index abzufragen. Wenn nicht angegeben, wird der Primärschlüsselindex abgefragt.

** `nextToken` **  
Das Paginierungs-Token für die Fortsetzung einer früheren Abfrage. Dieses wäre von einer vorherigen Abfrage erhalten worden. Dies ist ein optionales Feld.

** `limit` **  
Die maximale Anzahl der auszuwertenden Elemente (nicht notwendigerweise die Anzahl der übereinstimmenden Elemente). Dies ist ein optionales Feld.

** `scanIndexForward` **  
Ein boolescher Wert, der angibt, ob vorwärts oder rückwärts abgefragt werden soll. Dieses Feld ist optional und standardmäßig auf `true` gesetzt.

** `consistentRead` **  
Ein boolescher Wert, der angibt, ob bei der Abfrage von DynamoDB konsistente Lesevorgänge verwendet werden sollen. Dieses Feld ist optional und standardmäßig auf `false` gesetzt.

** `select` **  
Standardmäßig gibt der AWS AppSync DynamoDB-Resolver nur Attribute zurück, die in den Index projiziert werden. Wenn weitere Attribute erforderlich sind, kann dieses Feld festgelegt werden. Dies ist ein optionales Feld. Die unterstützten Werte sind:    
** `ALL_ATTRIBUTES` **  
Gibt alle Elementattribute aus der angegebenen Tabelle oder dem Index zurück. Wenn Sie einen lokalen sekundären Index abfragen, ruft DynamoDB für jedes übereinstimmende Element im Index das gesamte Element aus der übergeordneten Tabelle ab. Wenn der Index konfiguriert ist, um alle Elementattribute zu projizieren, können Sie alle Daten aus dem lokalen sekundären Index erhalten und das Abrufen ist nicht erforderlich.  
** `ALL_PROJECTED_ATTRIBUTES` **  
Nur bei der Abfrage eines Indexes erlaubt. Ruft alle Attribute ab, die in den Index projiziert wurden. Wenn der Index konfiguriert ist, um alle Attribute zu projizieren, entspricht dieser Rückgabewert der Angabe von `ALL_ATTRIBUTES`.  
**`SPECIFIC_ATTRIBUTES`**  
Gibt nur die in den s aufgeführten Attribute zurück. `projection` `expression` Dieser Rückgabewert entspricht der Angabe `projection` von 's' `expression` ohne Angabe eines Werts für`Select`.

**`projection`**  
Eine Projektion, die verwendet wird, um die Attribute anzugeben, die von der DynamoDB-Operation zurückgegeben werden sollen. [Weitere Informationen zu Projektionen finden Sie unter Projektionen.](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections) Dies ist ein optionales Feld.

Die Ergebnisse von DynamoDB werden automatisch in primitive GraphQL- und JSON-Typen konvertiert und sind im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

Die Ergebnisse weisen die folgende Struktur auf:

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

Die Felder sind wie folgt definiert:

** `items` **  
Eine Liste mit den von der DynamoDB-Abfrage zurückgegebenen Elementen.

** `nextToken` **  
Wenn es mehr Ergebnisse geben könnte, enthält `nextToken` ein Paginierungs-Token, das in einer anderen Anfrage verwendet werden kann. Beachten Sie, dass das von DynamoDB zurückgegebene Paginierungstoken AWS AppSync verschlüsselt und verschleiert wird. Damit sickern Daten aus Ihren Tabellen nicht versehentlich an den Aufrufer durch. Beachten Sie außerdem, dass diese Paginierungstoken nicht für verschiedene Funktionen oder Resolver verwendet werden können.

** `scannedCount` **  
Die Anzahl der Elemente, die mit dem Abfragebedingungsausdruck übereinstimmten, bevor ein Filterausdruck (falls vorhanden) angewendet wurde.

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für eine GraphQL-Abfrage`getPosts(owner: ID!)`.

In diesem Beispiel wird ein globaler sekundärer Index in einer Tabelle abgefragt, um alle Beiträge im Besitz der angegebenen ID zurückzugeben.

```
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',
  };
}
```

Weitere Informationen zur DynamoDB `Query`-API finden Sie in der [DynamoDB API-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html).

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

Mit der `Scan` Anfrage können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `Scan` Anfrage an DynamoDB zu stellen, und Sie können Folgendes angeben:
+ Ein Filter zum Ausschließen von Ergebnissen
+ Welcher Index verwendet werden soll
+ Wie viele Elemente zurückgegeben werden sollen
+ Ob Consistent-Lesevorgänge verwendet werden sollen
+ Paginierungs-Token
+ Parallele Scans

Das `Scan` Anforderungsobjekt hat die folgende Struktur:

```
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 };
  };
};
```

Die Felder sind wie folgt definiert:

## Felder scannen
<a name="js-scan-list"></a>

### Liste der Felder scannen
<a name="js-scan-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `Scan`-DynamoDB-Operation durchzuführen, muss diese auf `Scan` gesetzt sein. Dieser Wert ist erforderlich.

** `filter` **  
Ein Filter, der verwendet werden kann, um die Ergebnisse aus DynamoDB zu filtern, bevor sie zurückgegeben werden. Weitere Informationen zu Filtern finden Sie unter [Filter](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Dies ist ein optionales Feld.

** `index` **  
Der Name des abzufragenden Indexes. Der DynamoDB-Abfragevorgang ermöglicht es Ihnen, zusätzlich zum Primärschlüsselindex auch lokale sekundäre Indizes und globale sekundäre Indizes nach einem Hashschlüssel zu durchsuchen. Falls angegeben, weist dies DynamoDB an, den angegebenen Index abzufragen. Wenn nicht angegeben, wird der Primärschlüsselindex abgefragt.

** `limit` **  
Die maximale Anzahl der zu einem bestimmten Zeitpunkt auszuwertenden Elemente. Dies ist ein optionales Feld.

** `consistentRead` **  
Ein boolescher Wert, der angibt, ob bei der Abfrage von DynamoDB konsistente Lesevorgänge verwendet werden sollen. Dieses Feld ist optional und standardmäßig auf `false` gesetzt.

** `nextToken` **  
Das Paginierungs-Token für die Fortsetzung einer früheren Abfrage. Dieses wäre von einer vorherigen Abfrage erhalten worden. Dies ist ein optionales Feld.

** `select` **  
Standardmäßig gibt die AWS AppSync DynamoDB-Funktion nur die Attribute zurück, die in den Index projiziert werden. Wenn weitere Attribute erforderlich sind, kann dieses Feld festgelegt werden. Dies ist ein optionales Feld. Die unterstützten Werte sind:    
** `ALL_ATTRIBUTES` **  
Gibt alle Elementattribute aus der angegebenen Tabelle oder dem Index zurück. Wenn Sie einen lokalen sekundären Index abfragen, ruft DynamoDB für jedes übereinstimmende Element im Index das gesamte Element aus der übergeordneten Tabelle ab. Wenn der Index konfiguriert ist, um alle Elementattribute zu projizieren, können Sie alle Daten aus dem lokalen sekundären Index erhalten und das Abrufen ist nicht erforderlich.  
** `ALL_PROJECTED_ATTRIBUTES` **  
Nur bei der Abfrage eines Indexes erlaubt. Ruft alle Attribute ab, die in den Index projiziert wurden. Wenn der Index konfiguriert ist, um alle Attribute zu projizieren, entspricht dieser Rückgabewert der Angabe von `ALL_ATTRIBUTES`.  
**`SPECIFIC_ATTRIBUTES`**  
Gibt nur die in den s aufgeführten Attribute zurück. `projection` `expression` Dieser Rückgabewert entspricht der Angabe `projection` von 's' `expression` ohne Angabe eines Werts für`Select`.

** `totalSegments` **  
Die Anzahl der Segmente zum Partitionieren der Tabelle, wenn ein paralleler Scan durchgeführt wird. Dieses Feld ist optional, muss aber angegeben werden, wenn `segment` angegeben ist.

** `segment` **  
Das Tabellensegment in dieser Operation beim Durchführen eines parallelen Scans. Dieses Feld ist optional, muss aber angegeben werden, wenn `totalSegments` angegeben ist.

**`projection`**  
Eine Projektion, die verwendet wird, um die Attribute anzugeben, die von der DynamoDB-Operation zurückgegeben werden sollen. [Weitere Informationen zu Projektionen finden Sie unter Projektionen.](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections) Dies ist ein optionales Feld.

Die vom DynamoDB-Scan zurückgegebenen Ergebnisse werden automatisch in primitive GraphQL- und JSON-Typen konvertiert und sind im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

Die Ergebnisse weisen die folgende Struktur auf:

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

Die Felder sind wie folgt definiert:

** `items` **  
Eine Liste mit den vom DynamoDB-Scan zurückgegebenen Elementen.

** `nextToken` **  
Falls es mehr Ergebnisse gibt, `nextToken` enthält sie ein Paginierungstoken, das Sie in einer anderen Anfrage verwenden können. AWS AppSync verschlüsselt und verschleiert das von DynamoDB zurückgegebene Paginierungstoken. Damit sickern Daten aus Ihren Tabellen nicht versehentlich an den Aufrufer durch. Außerdem können diese Paginierungstoken nicht für verschiedene Funktionen oder Resolver verwendet werden.

** `scannedCount` **  
Die Anzahl der Elemente, die von DynamoDB abgerufen wurden, bevor ein Filterausdruck (falls vorhanden) angewendet wurde.

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für die GraphQL-Abfrage:`allPosts`.

In diesem Beispiel werden alle Einträge in der Tabelle zurückgegeben.

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

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für die GraphQL-Abfrage:`postsMatching(title: String!)`.

In diesem Beispiel werden alle Einträge in der Tabelle zurückgegeben, bei denen der Titel mit dem `title`-Argument beginnt.

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

Weitere Informationen zur DynamoDB `Scan`-API finden Sie in der [DynamoDB API-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html).

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

Mit dem `Sync` Anforderungsobjekt können Sie alle Ergebnisse aus einer DynamoDB-Tabelle abrufen und anschließend nur die Daten empfangen, die seit Ihrer letzten Abfrage geändert wurden (die Delta-Updates). `Sync`Anfragen können nur an versionierte DynamoDB-Datenquellen gestellt werden. Sie können Folgendes angeben:
+ Ein Filter zum Ausschließen von Ergebnissen
+ Wie viele Elemente zurückgegeben werden sollen
+ Paginierungstoken
+ Wann Ihre letzte `Sync`-Operation gestartet wurde

Das `Sync` Anforderungsobjekt hat die folgende Struktur:

```
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 };
  };
};
```

Die Felder sind wie folgt definiert:

## Felder synchronisieren
<a name="js-sync-list"></a>

### Liste der Felder synchronisieren
<a name="js-sync-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `Sync`--Operation durchzuführen, muss diese auf `Sync` gesetzt sein. Dieser Wert ist erforderlich.

** `filter` **  
Ein Filter, der verwendet werden kann, um die Ergebnisse aus DynamoDB zu filtern, bevor sie zurückgegeben werden. Weitere Informationen zu Filtern finden Sie unter [Filter](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Dies ist ein optionales Feld.

** `limit` **  
Die maximale Anzahl der zu einem bestimmten Zeitpunkt auszuwertenden Elemente. Dies ist ein optionales Feld. Wenn nicht angegeben, wird das Standardlimit auf `100` Elemente festgelegt. Der maximale Wert für dieses Feld ist `1000` Elemente.

** `nextToken` **  
Das Paginierungs-Token für die Fortsetzung einer früheren Abfrage. Dieses wäre von einer vorherigen Abfrage erhalten worden. Dies ist ein optionales Feld.

** `lastSync` **  
Der Moment, in Epochenmillisekunden, an dem die letzte erfolgreiche `Sync`-Operation gestartet wurde. Wenn angegeben, werden nur Elemente zurückgegeben, die sich nach `lastSync` geändert haben. Dieses Feld ist optional und sollte nur ausgefüllt werden, nachdem alle Seiten von einem ersten `Sync`-Vorgang abgerufen wurden. Wenn nicht angegeben, werden Ergebnisse aus der *Basis*-Tabelle zurückgegeben, andernfalls werden Ergebnisse aus der *Delta*-Tabelle zurückgegeben.

**`basePartitionKey`**  
Der Partitionsschlüssel der *Basistabelle*, der bei der Ausführung eines `Sync` Vorgangs verwendet wird. In diesem Feld kann eine `Sync` Operation ausgeführt werden, wenn die Tabelle einen benutzerdefinierten Partitionsschlüssel verwendet. Dies ist ein optionales Feld.

**`deltaIndexName`**  
Der für die `Sync` Operation verwendete Index. Dieser Index ist erforderlich, um einen `Sync` Vorgang für die gesamte Delta-Speichertabelle zu aktivieren, wenn die Tabelle einen benutzerdefinierten Partitionsschlüssel verwendet. Die `Sync` Operation wird auf der GSI (erstellt am `gsi_ds_pk` und`gsi_ds_sk`) ausgeführt. Dies ist ein optionales Feld.

Die von der DynamoDB-Synchronisierung zurückgegebenen Ergebnisse werden automatisch in primitive GraphQL- und JSON-Typen konvertiert und sind im Kontext result () verfügbar. `context.result`

Weitere Informationen zur DynamoDB-Typkonvertierung finden Sie unter [Typsystem (Antwortzuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)).

[Weitere Informationen zu JavaScript Resolvern finden Sie unter JavaScript Übersicht über Resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

Die Ergebnisse weisen die folgende Struktur auf:

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

Die Felder sind wie folgt definiert:

** `items` **  
Eine Liste mit den Elementen, die von der Synchronisierung zurückgegeben wurden.

** `nextToken` **  
Falls es möglicherweise mehr Ergebnisse gibt, `nextToken` enthält es ein Paginierungstoken, das Sie in einer anderen Anfrage verwenden können. AWS AppSync verschlüsselt und verschleiert das von DynamoDB zurückgegebene Paginierungstoken. Damit sickern Daten aus Ihren Tabellen nicht versehentlich an den Aufrufer durch. Außerdem können diese Paginierungstoken nicht für verschiedene Funktionen oder Resolver verwendet werden.

** `scannedCount` **  
Die Anzahl der Elemente, die von DynamoDB abgerufen wurden, bevor ein Filterausdruck (falls vorhanden) angewendet wurde.

** `startedAt` **  
Der Moment, in Epochenmillisekunden, an dem der Synchronisierungsvorgang gestartet wurde, den Sie lokal speichern und in einer anderen Anforderung als `lastSync`-Argument verwenden können. Wenn ein Paginierungstoken in der Anforderung enthalten war, entspricht dieser Wert dem Wert, der von der Anforderung für die erste Ergebnisseite zurückgegeben wird.

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

Das folgende Beispiel ist ein Funktionsanforderungshandler für die GraphQL-Abfrage:`syncPosts(nextToken: String, lastSync: AWSTimestamp)`.

Wenn in diesem Beispiel `lastSync` weggelassen wird, werden alle Einträge in der Basistabelle zurückgegeben. Wenn `lastSync` angegeben wird, werden nur die Einträge in der Delta-Synchronisationstabelle zurückgegeben, die sich seit `lastSync` geändert haben.

```
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>

Mit dem `BatchGetItem` Anforderungsobjekt können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `BatchGetItem` Anforderung an DynamoDB zu stellen, um mehrere Elemente abzurufen, möglicherweise über mehrere Tabellen hinweg. Für dieses Anforderungsobjekt müssen Sie Folgendes angeben:
+ Die Namen der Tabellen, aus denen die Elemente abgerufen werden sollen.
+ Die Schlüssel der Elemente, die aus den einzelnen Tabellen abgerufen werden sollen.

Es gelten die DynamoDB `BatchGetItem`-Grenzwerte, und es kann **kein Bedingungsausdruck** bereitgestellt werden.

Das `BatchGetItem` Anforderungsobjekt hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### BatchGetItem Liste der Felder
<a name="js-BatchGetItem-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `BatchGetItem`-DynamoDB-Operation durchzuführen, muss diese auf `BatchGetItem` gesetzt sein. Dieser Wert ist erforderlich.

** `tables` **  
Die DynamoDB-Tabellen, aus denen die Elemente abgerufen werden sollen. Der Wert ist eine Zuweisung, in der Tabellennamen als Schlüssel der Zuweisung angegeben werden. Mindestens eine Tabelle muss angegeben werden. Dieser `tables`-Wert ist erforderlich.    
** `keys` **  
Liste der DynamoDB-Schlüssel, die den Primärschlüssel der abzurufenden Elemente darstellen. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)).  
** `consistentRead` **  
Ob bei der Ausführung eines *GetItem*Vorgangs ein konsistenter Lesevorgang verwendet werden soll. Dieser Wert ist optional und ist standardmäßig *false*.  
**`projection`**  
Eine Projektion, die verwendet wird, um die Attribute anzugeben, die von der DynamoDB-Operation zurückgegeben werden sollen. [Weitere Informationen zu Projektionen finden Sie unter Projektionen.](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections) Dies ist ein optionales Feld.

Beachten Sie Folgendes:
+ Wenn ein Element nicht aus der Tabelle abgerufen wurde, enthält der Datenblock für diese Tabelle ein *null*-Element.
+ Die Aufrufergebnisse werden nach Tabelle sortiert, basierend auf der Reihenfolge, in der sie innerhalb des Anforderungsobjekts bereitgestellt wurden.
+ Jeder `Get` Befehl innerhalb von a `BatchGetItem` ist atomar, ein Batch kann jedoch teilweise verarbeitet werden. Wenn ein Stapel aufgrund eines Fehlers teilweise verarbeitet wird, werden die nicht verarbeiteten Schlüssel als Teil des Aufrufergebnisses im Block *unprocessedKeys* zurückgegeben.
+  `BatchGetItem` ist auf 100 Schlüssel beschränkt.

Für das folgende Beispiel für einen Funktionsanforderungshandler:

```
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 })],
    },
  };
}
```

Das in `ctx.result` verfügbare Aufrufergebnis sieht wie folgt aus:

```
{
   "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` enthält die Einzelheiten zu dem Fehler. Die Schlüssel **data**, **unprocessedKeys und jeder Tabellenschlüssel**, der im Ergebnis im Funktionsanforderungsobjekt bereitgestellt wurde, sind garantiert im Aufrufergebnis vorhanden. Elemente, die gelöscht wurden, befinden sich im Block **data**. Elemente, die nicht verarbeitet wurden, werden im Datenblock mit *null* markiert und im Block **unprocessedKeys** platziert.

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

Mit dem `BatchDeleteItem` Anforderungsobjekt können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `BatchWriteItem` Anforderung an DynamoDB zu stellen, um mehrere Elemente zu löschen, möglicherweise über mehrere Tabellen hinweg. Für dieses Anforderungsobjekt müssen Sie Folgendes angeben:
+ Die Namen der Tabellen, aus denen die Elemente gelöscht werden sollen.
+ Die Schlüssel der Elemente, die aus den einzelnen Tabellen gelöscht werden sollen.

Es gelten die DynamoDB `BatchWriteItem`-Grenzwerte, und es kann **kein Bedingungsausdruck** bereitgestellt werden.

Das `BatchDeleteItem` Anforderungsobjekt hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### BatchDeleteItem Liste der Felder
<a name="js-BatchDeleteItem-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `BatchDeleteItem`-DynamoDB-Operation durchzuführen, muss diese auf `BatchDeleteItem` gesetzt sein. Dieser Wert ist erforderlich.

** `tables` **  
Die DynamoDB-Tabellen, aus denen die Elemente gelöscht werden sollen. Jede Tabelle ist eine Liste von DynamoDB-Schlüsseln, die den Primärschlüssel der zu löschenden Elemente darstellen. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Mindestens eine Tabelle muss angegeben werden. Der `tables` Wert ist erforderlich.

Beachten Sie Folgendes:
+ Im Gegensatz zum `DeleteItem`-Vorgang wird nicht das vollständig gelöschte Element in der Antwort zurückgegeben. Nur der übergebene Schlüssel wird zurückgegeben.
+ Wenn ein Element nicht aus der Tabelle gelöscht wurde, enthält der Datenblock für diese Tabelle ein *null*-Element.
+ Die Aufrufergebnisse werden nach Tabelle sortiert, basierend auf der Reihenfolge, in der sie innerhalb des Anforderungsobjekts bereitgestellt wurden.
+ Jeder `Delete` Befehl innerhalb von a `BatchDeleteItem` ist atomar. Ein Stapel kann jedoch teilweise verarbeitet werden. Wenn ein Stapel aufgrund eines Fehlers teilweise verarbeitet wird, werden die nicht verarbeiteten Schlüssel als Teil des Aufrufergebnisses im Block *unprocessedKeys* zurückgegeben.
+  `BatchDeleteItem` ist auf 25 Schlüssel beschränkt.
+ Dieser Vorgang **wird nicht** unterstützt, wenn er zusammen mit der Konflikterkennung verwendet wird. Wenn Sie beide gleichzeitig verwenden, kann dies zu einem Fehler führen.

Für das folgende Beispiel für einen Funktionsanforderungshandler:

```
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 })],
    },
  };
}
```

Das in `ctx.result` verfügbare Aufrufergebnis sieht wie folgt aus:

```
{
   "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` enthält die Einzelheiten zu dem Fehler. Die Schlüssel **data**, **unprocessedKeys und jeder Tabellenschlüssel**, der im Funktionsanforderungsobjekt bereitgestellt wurde, sind garantiert im Aufrufergebnis vorhanden. Elemente, die gelöscht wurden, befinden sich im Block **data**. Elemente, die nicht verarbeitet wurden, werden im Datenblock mit *null* markiert und im Block **unprocessedKeys** platziert.

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

Mit dem `BatchPutItem` Anforderungsobjekt können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `BatchWriteItem` Anforderung an DynamoDB zu stellen, um mehrere Elemente zu platzieren, möglicherweise in mehreren Tabellen. Für dieses Anforderungsobjekt müssen Sie Folgendes angeben:
+ Die Namen der Tabellen, in denen die Elemente abgelegt werden sollen.
+ Die vollständigen Elemente, die in jeder Tabelle abgelegt werden sollen

Es gelten die DynamoDB `BatchWriteItem`-Grenzwerte, und es kann **kein Bedingungsausdruck** bereitgestellt werden.

Das `BatchPutItem` Anforderungsobjekt hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### BatchPutItem Liste der Felder
<a name="js-BatchPutItem-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `BatchPutItem`-DynamoDB-Operation durchzuführen, muss diese auf `BatchPutItem` gesetzt sein. Dieser Wert ist erforderlich.

** `tables` **  
Die DynamoDB-Tabellen, in die die Elemente eingefügt werden sollen. Jeder Tabelleneintrag stellt eine Liste von DynamoDB-Elementen dar, die für diese spezifische Tabelle eingefügt werden sollen. Mindestens eine Tabelle muss angegeben werden. Dieser Wert ist erforderlich.

Beachten Sie Folgendes:
+ Bei Erfolg werden die vollständig eingefügten Elemente in der Antwort zurückgegeben.
+ Wenn ein Element nicht in die Tabelle eingefügt wurde, wird im Datenblock für diese Tabelle ein *null*-Element angezeigt.
+ Die eingefügten Elemente werden nach Tabelle sortiert, basierend auf der Reihenfolge, in der sie im Anforderungsobjekt bereitgestellt wurden.
+ Jeder `Put` Befehl innerhalb von a `BatchPutItem` ist atomar, ein Batch kann jedoch teilweise verarbeitet werden. Wenn ein Stapel aufgrund eines Fehlers teilweise verarbeitet wird, werden die nicht verarbeiteten Schlüssel als Teil des Aufrufergebnisses im Block *unprocessedKeys* zurückgegeben.
+  `BatchPutItem` ist auf 25 Elemente beschränkt.
+ Dieser Vorgang **wird nicht** unterstützt, wenn er zusammen mit der Konflikterkennung verwendet wird. Wenn Sie beide gleichzeitig verwenden, kann dies zu einem Fehler führen.

Für das folgende Beispiel für einen Funktionsanforderungshandler:

```
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 })],
    },
  };
}
```

Das in `ctx.result` verfügbare Aufrufergebnis sieht wie folgt aus:

```
{
   "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` enthält die Einzelheiten zu dem Fehler. Die Schlüssel **data**, **unprocessedItems** und jeder Tabellenschlüssel, der im Anforderungsobjekt bereitgestellt wurde, sind garantiert im Aufrufergebnis vorhanden. Elemente, die eingefügt wurden, befinden sich im Block **data**. Elemente, die nicht verarbeitet wurden, werden im Datenblock mit *null* markiert und im Block **unprocessedItems** platziert.

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

Mit dem `TransactGetItems` Anforderungsobjekt können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `TransactGetItems` Anforderung an DynamoDB zu stellen, um mehrere Elemente abzurufen, möglicherweise über mehrere Tabellen hinweg. Für dieses Anforderungsobjekt müssen Sie Folgendes angeben:
+ Der Tabellenname jedes Anforderungselements, von dem das Element abgerufen werden soll
+ Der Schlüssel jedes Anforderungselements, das aus jeder Tabelle abgerufen werden soll

Es gelten die DynamoDB `TransactGetItems`-Grenzwerte, und es kann **kein Bedingungsausdruck** bereitgestellt werden.

Das `TransactGetItems` Anforderungsobjekt hat die folgende Struktur:

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

Die Felder sind wie folgt definiert:

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

### TransactGetItems Liste der Felder
<a name="js-TransactGetItems-list-col"></a>

** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `TransactGetItems`-DynamoDB-Operation durchzuführen, muss diese auf `TransactGetItems` gesetzt sein. Dieser Wert ist erforderlich.

** `transactItems` **  
Die einzuschließenden Anforderungselemente. Der Wert ist ein Array von Anforderungselementen. Es muss mindestens ein Anforderungselement angegeben werden. Dieser `transactItems`-Wert ist erforderlich.    
** `table` **  
Die DynamoDB-Tabelle, aus der das Element abgerufen werden soll. Der Wert ist eine Zeichenfolge des Tabellennamens. Dieser `table`-Wert ist erforderlich.  
** `key` **  
Der DynamoDB-Schlüssel, der den Primärschlüssel des abzurufenden Elements darstellt. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)).  
**`projection`**  
Eine Projektion, die verwendet wird, um die Attribute anzugeben, die von der DynamoDB-Operation zurückgegeben werden sollen. [Weitere Informationen zu Projektionen finden Sie unter Projektionen.](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections) Dies ist ein optionales Feld.

Beachten Sie Folgendes:
+ Wenn eine Transaktion erfolgreich ist, entspricht die Reihenfolge der abgerufenen Elemente im `items`-Block der Reihenfolge der Anforderungselemente.
+ Transaktionen werden in irgendeiner all-or-nothing Weise ausgeführt. Wenn ein Anforderungselement einen Fehler verursacht, wird die gesamte Transaktion nicht ausgeführt, und Fehlerdetails werden zurückgegeben.
+ Ein Anforderungselement, das nicht abgerufen werden kann, ist kein Fehler. Stattdessen erscheint ein *Null*-Element im *Elemente*-Block an der entsprechenden Position.
+ Wenn der Fehler einer Transaktion lautet *TransactionCanceledException*, wird der `cancellationReasons` Block aufgefüllt. Die Reihenfolge der Stornierungsgründe im `cancellationReasons`-Block ist die gleiche wie die Reihenfolge der Anforderungselemente.
+  `TransactGetItems`ist auf 100 Anfrageelemente begrenzt.

Für das folgende Beispiel für einen Funktionsanforderungshandler:

```
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 }),
      },
    ],
  };
}
```

Wenn die Transaktion erfolgreich ist und nur das erste angeforderte Element abgerufen wird, ist das Aufrufergebnis in `ctx.result` wie folgt verfügbar:

```
{
    "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
}
```

Wenn die Transaktion *TransactionCanceledException*aufgrund des ersten Anforderungselements fehlschlägt, `ctx.result` ist das Aufrufergebnis wie folgt verfügbar:

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

`ctx.error` enthält die Einzelheiten zu dem Fehler. Die Schlüssel-**Elemente** und **Stornierungsgründe** sind garantiert in `ctx.result` vorhanden.

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

Mit dem `TransactWriteItems` Anforderungsobjekt können Sie die AWS AppSync DynamoDB-Funktion anweisen, eine `TransactWriteItems` Anforderung an DynamoDB zu stellen, um mehrere Elemente zu schreiben, möglicherweise in mehrere Tabellen. Für dieses Anforderungsobjekt müssen Sie Folgendes angeben:
+ Der Name der Zieltabelle jedes Anforderungselements
+ Der Vorgang jedes auszuführenden Anforderungselements. Es gibt vier Arten von Operationen, die unterstützt werden: *PutItem*UpdateItem**, *DeleteItem*, und *ConditionCheck* 
+ Der Schlüssel jedes zu schreibenden Anforderungselements

Es gelten die DynamoDB `TransactWriteItems`-Grenzwerte.

Das `TransactWriteItems` Anforderungsobjekt hat die folgende Struktur:

```
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 Felder
<a name="js-TransactWriteItems-list"></a>

### TransactWriteItems Liste der Felder
<a name="js-TransactWriteItems-list-col"></a>

**Die Felder sind wie folgt definiert: **    
** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `TransactWriteItems`-DynamoDB-Operation durchzuführen, muss diese auf `TransactWriteItems` gesetzt sein. Dieser Wert ist erforderlich.  
** `transactItems` **  
Die einzuschließenden Anforderungselemente. Der Wert ist ein Array von Anforderungselementen. Es muss mindestens ein Anforderungselement angegeben werden. Dieser `transactItems`-Wert ist erforderlich.  
Für `PutItem` sind die Felder wie folgt definiert:    
** `table` **  
Die DynamoDB-Zieltabelle. Der Wert ist eine Zeichenfolge des Tabellennamens. Dieser `table`-Wert ist erforderlich.  
** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `PutItem`-DynamoDB-Operation durchzuführen, muss diese auf `PutItem` gesetzt sein. Dieser Wert ist erforderlich.  
** `key` **  
Der DynamoDB-Schlüssel, der den Primärschlüssel des einzufügenden Elements darstellt. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser Wert ist erforderlich.  
** `attributeValues` **  
Der Rest der Attribute des Elements, die in DynamoDB gespeichert werden sollen. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dies ist ein optionales Feld.  
** `condition` **  
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Wenn keine Bedingung angegeben ist, überschreibt die `PutItem`-Anforderung alle vorhandenen Einträge für dieses Element. Sie können angeben, ob das vorhandene Element zurückgerufen werden soll, wenn die Bedingungsprüfung fehlschlägt. Weitere Informationen zu Transaktionsbedingungen finden Sie unter Ausdrücke für [Transaktionsbedingungen](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Dieser Wert ist optional.
Für `UpdateItem` sind die Felder wie folgt definiert:    
** `table` **  
Die zu aktualisierende DynamoDB-Tabelle. Der Wert ist eine Zeichenfolge des Tabellennamens. Dieser `table`-Wert ist erforderlich.  
** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `UpdateItem`-DynamoDB-Operation durchzuführen, muss diese auf `UpdateItem` gesetzt sein. Dieser Wert ist erforderlich.  
** `key` **  
Der DynamoDB-Schlüssel, der den Primärschlüssel des zu aktualisierenden Elements darstellt. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser Wert ist erforderlich.  
** `update` **  
`update`In diesem Abschnitt können Sie einen Aktualisierungsausdruck angeben, der beschreibt, wie das Element in DynamoDB aktualisiert wird. Weitere Informationen zum Schreiben von Aktualisierungsausdrücken finden Sie in der [DynamoDB-Dokumentation UpdateExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Dieser Abschnitt ist erforderlich.  
** `condition` **  
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Wenn keine Bedingung angegeben ist, aktualisiert die `UpdateItem`-Anforderung jeden vorhandenen Eintrag unabhängig vom aktuellen Status. Sie können angeben, ob das vorhandene Element zurückgerufen werden soll, wenn die Bedingungsprüfung fehlschlägt. [Weitere Informationen zu Transaktionsbedingungen finden Sie unter Ausdrücke für Transaktionsbedingungen.](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions) Dieser Wert ist optional.
Für `DeleteItem` sind die Felder wie folgt definiert:    
** `table` **  
Die DynamoDB-Tabelle, in der das Element gelöscht werden soll. Der Wert ist eine Zeichenfolge des Tabellennamens. Dieser `table`-Wert ist erforderlich.  
** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `DeleteItem`-DynamoDB-Operation durchzuführen, muss diese auf `DeleteItem` gesetzt sein. Dieser Wert ist erforderlich.  
** `key` **  
Der DynamoDB-Schlüssel, der den Primärschlüssel des zu löschenden Elements darstellt. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser Wert ist erforderlich.  
** `condition` **  
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Wenn keine Bedingung angegeben ist, löscht die `DeleteItem`-Anforderung ein Element unabhängig vom aktuellen Status. Sie können angeben, ob das vorhandene Element zurückgerufen werden soll, wenn die Bedingungsprüfung fehlschlägt. Weitere Informationen zu Transaktionsbedingungen finden Sie unter Ausdrücke für [Transaktionsbedingungen](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Dieser Wert ist optional.
Für `ConditionCheck` sind die Felder wie folgt definiert:    
** `table` **  
Die DynamoDB-Tabelle, in der der Zustand überprüft werden soll. Der Wert ist eine Zeichenfolge des Tabellennamens. Dieser `table`-Wert ist erforderlich.  
** `operation` **  
Der DynamoDB DynamoDB-Vorgang. Um die `ConditionCheck`-DynamoDB-Operation durchzuführen, muss diese auf `ConditionCheck` gesetzt sein. Dieser Wert ist erforderlich.  
** `key` **  
Der DynamoDB-Schlüssel, der den Primärschlüssel des Artikels zur Zustandsprüfung darstellt. DynamoDB-Elemente können je nach Tabellenstruktur einen einzelnen Hashschlüssel oder einen Hashschlüssel und einen Sortierschlüssel haben. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser Wert ist erforderlich.  
** `condition` **  
Eine Bedingung, um zu bestimmen, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Status des Objekts, das sich bereits in DynamoDB befindet. Sie können angeben, ob das vorhandene Element zurückgerufen werden soll, wenn die Bedingungsprüfung fehlschlägt. Weitere Informationen zu Transaktionsbedingungen finden Sie unter Ausdrücke für [Transaktionsbedingungen](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Dieser Wert ist erforderlich.

Beachten Sie Folgendes:
+ Nur Schlüssel von Anforderungselementen werden in der Antwort zurückgegeben, wenn diese erfolgreich ist. Die Reihenfolge der Schlüssel entspricht der Reihenfolge der Anforderungselemente.
+ Transaktionen werden auf irgendeine Weise ausgeführt. all-or-nothing Wenn ein Anforderungselement einen Fehler verursacht, wird die gesamte Transaktion nicht ausgeführt, und Fehlerdetails werden zurückgegeben.
+ Es können keine zwei Anforderungselemente auf dasselbe Element ausgerichtet werden. Andernfalls führen sie zu *TransactionCanceledException*Fehlern.
+ Wenn der Fehler einer Transaktion vorliegt *TransactionCanceledException*, wird der `cancellationReasons` Block aufgefüllt. Wenn die Bedingungsprüfung eines Anforderungselements fehlschlägt **und** Sie nicht `returnValuesOnConditionCheckFailure` als `false` angegeben haben, wird das in der Tabelle vorhandene Element `item` an der entsprechenden Position des `cancellationReasons`-Blocks abgerufen und gespeichert.
+  `TransactWriteItems`ist auf 100 Anfrageelemente begrenzt.
+ Dieser Vorgang **wird nicht** unterstützt, wenn er zusammen mit der Konflikterkennung verwendet wird. Wenn Sie beide gleichzeitig verwenden, kann dies zu einem Fehler führen.

Für das folgende Beispiel für einen Funktionsanforderungshandler:

```
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 }),
        },
      },
    ],
  };
}
```

Wenn die Transaktion erfolgreich ist, ist das Aufrufergebnis in `ctx.result` wie folgt verfügbar:

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

Wenn die Transaktion aufgrund eines Fehlers bei der Zustandsprüfung der `PutItem` Anforderung fehlschlägt, `ctx.result` ist das Aufrufergebnis wie folgt verfügbar:

```
{
    "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` enthält die Einzelheiten zu dem Fehler. Die Schlüssel **keys** und **cancellationReasons** sind garantiert in `ctx.result` vorhanden.

# Geben Sie System ein (Zuordnung der Anfrage)
<a name="js-aws-appsync-resolver-reference-dynamodb-typed-values-request"></a>

Wenn Sie die AWS AppSync DynamoDB-Funktion zum Aufrufen Ihrer DynamoDB-Tabellen verwenden, AWS AppSync müssen Sie den Typ der einzelnen Werte kennen, die in diesem Aufruf verwendet werden sollen. Dies liegt daran, dass DynamoDB mehr Typprimitive unterstützt als GraphQL oder JSON (z. B. Sets und Binärdaten). AWS AppSync benötigt einige Hinweise bei der Übersetzung zwischen GraphQL und DynamoDB, andernfalls müsste es einige Annahmen darüber treffen, wie Daten in Ihrer Tabelle strukturiert sind.

[Weitere Informationen zu DynamoDB-Datentypen finden Sie in der Dokumentation zu [DynamoDB-Datentypdeskriptoren und Datentypen](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html#Programming.LowLevelAPI.DataTypeDescriptors).](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes)

Ein DynamoDB-Wert wird durch ein JSON-Objekt dargestellt, das ein einzelnes Schlüssel-Wert-Paar enthält. Der Schlüssel gibt den DynamoDB-Typ an, und der Wert gibt den Wert selbst an. Im folgenden Beispiel gibt der Schlüssel `S` an, dass der Wert eine Zeichenfolge und der Wert `identifier` selbst ein Zeichenfolgewert ist.

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

Beachten Sie, dass das JSON-Objekt nicht mehr als ein Schlüssel-Wert-Paar haben kann. Wenn mehr als ein Schlüssel-Wert-Paar angegeben ist, wird das Anforderungsobjekt nicht analysiert.

Ein DynamoDB-Wert wird überall in einem Anforderungsobjekt verwendet, wo Sie einen Wert angeben müssen. Zu den Stellen, an denen Sie dies durchführen müssen, gehören: die Abschnitte `key` und `attributeValue` und der Bereich `expressionValues` von Ausdrucksabschnitten. Im folgenden Beispiel `identifier` wird der DynamoDB-Zeichenkettenwert dem `id` Feld in einem `key` Abschnitt (möglicherweise in einem `GetItem` Anforderungsobjekt) zugewiesen.

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

 **Unterstützte Typen** 

AWS AppSync unterstützt die folgenden DynamoDB-Skalar-, Dokument- und Satztypen:

**Zeichenfolgetyp `S` **  
Ein einzelner Zeichenfolgewert. Ein DynamoDB-Zeichenkettenwert wird wie folgt bezeichnet:  

```
{ "S" : "some string" }
```
Eine Verwendungsbeispiel ist:  

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

**Zeichenfolgesatztyp `SS` **  
Ein Satz von Zeichenfolgewerten. Ein DynamoDB String Set-Wert wird wie folgt bezeichnet:  

```
{ "SS" : [ "first value", "second value", ... ] }
```
Eine Verwendungsbeispiel ist:  

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

**Zahlentyp `N` **  
Ein einzelner numerischer Wert. Ein DynamoDB-Zahlenwert wird wie folgt bezeichnet:  

```
{ "N" : 1234 }
```
Eine Verwendungsbeispiel ist:  

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

**Zahlensatztyp `NS` **  
Ein Satz von Zahlenwerten. Ein DynamoDB Number Set-Wert wird wie folgt bezeichnet:  

```
{ "NS" : [ 1, 2.3, 4 ... ] }
```
Eine Verwendungsbeispiel ist:  

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

**Binärtyp `B` **  
Ein Binärwert. Ein DynamoDB-Binärwert wird wie folgt bezeichnet:  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
Beachten Sie, dass es sich bei dem Wert tatsächlich um eine Zeichenfolge handelt, wobei die Zeichenfolge die Base64-kodierte Darstellung der Binärdaten ist. AWS AppSync dekodiert diese Zeichenfolge wieder in ihren Binärwert, bevor sie an DynamoDB gesendet wird. AWS AppSync verwendet das Base64-Dekodierungsschema, wie es in RFC 2045 definiert ist: Jedes Zeichen, das nicht im Base64-Alphabet vorkommt, wird ignoriert.  
Eine Verwendungsbeispiel ist:  

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

**Binärsatztyp `BS` **  
Ein Satz von Binärwerten. Ein DynamoDB Binary Set-Wert wird wie folgt bezeichnet:  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
Beachten Sie, dass es sich bei dem Wert tatsächlich um eine Zeichenfolge handelt, wobei die Zeichenfolge die Base64-kodierte Darstellung der Binärdaten ist. AWS AppSync dekodiert diese Zeichenfolge wieder in ihren Binärwert, bevor sie an DynamoDB gesendet wird. AWS AppSync verwendet das Base64-Dekodierungsschema, wie es in RFC 2045 definiert ist: Jedes Zeichen, das nicht im Base64-Alphabet vorkommt, wird ignoriert.  
Eine Verwendungsbeispiel ist:  

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

**Boolescher Typ `BOOL` **  
Ein Boolescher Wert Ein boolescher DynamoDB-Wert wird wie folgt bezeichnet:  

```
{ "BOOL" : true }
```
Beachten Sie, dass nur `true` und `false` gültige Werte sind.  
Eine Verwendungsbeispiel ist:  

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

**Listentyp `L` **  
Eine Liste aller anderen unterstützten DynamoDB-Werte. Ein DynamoDB-Listenwert wird wie folgt gekennzeichnet:  

```
{ "L" : [ ... ] }
```
Beachten Sie, dass es sich bei dem Wert um einen zusammengesetzten Wert handelt, wobei die Liste null oder mehr aller unterstützten DynamoDB-Werte (einschließlich anderer Listen) enthalten kann. Die Liste kann auch eine Mischung aus verschiedenen Typen enthalten.  
Eine Verwendungsbeispiel ist:  

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

**Zuordnungstyp `M` **  
Stellt eine ungeordnete Sammlung von Schlüssel-Wert-Paaren anderer unterstützter DynamoDB-Werte dar. Ein DynamoDB-Zuordnungswert wird wie folgt bezeichnet:  

```
{ "M" : { ... } }
```
Beachten Sie, dass eine Zuordnung null oder mehrere Schlüssel-Wert-Paare enthalten kann. Der Schlüssel muss eine Zeichenfolge sein, und der Wert kann ein beliebiger unterstützter DynamoDB-Wert sein (einschließlich anderer Maps). Die Zuordnung kann auch eine Mischung aus verschiedenen Typen enthalten.  
Eine Verwendungsbeispiel ist:  

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

**Null-Typ `NULL` **  
Ein Null-Wert. Ein DynamoDB-Null-Wert wird wie folgt bezeichnet:  

```
{ "NULL" : null }
```
Eine Verwendungsbeispiel ist:  

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

Weitere Informationen zu den einzelnen Typen finden Sie in der [DynamoDB-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html).

# Geben Sie System ein (Antwortzuordnung)
<a name="js-aws-appsync-resolver-reference-dynamodb-typed-values-responses"></a>

Wenn Sie eine Antwort von DynamoDB erhalten, konvertiert sie AWS AppSync automatisch in primitive GraphQL- und JSON-Typen. Jedes Attribut in DynamoDB wird dekodiert und im Kontext des Antworthandlers zurückgegeben.

Wenn DynamoDB beispielsweise Folgendes zurückgibt:

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

Wenn das Ergebnis von Ihrem Pipeline-Resolver zurückgegeben wird, AWS AppSync konvertiert es in GraphQL- und JSON-Typen wie folgt:

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

In diesem Abschnitt wird erklärt, wie die folgenden DynamoDB-Skalar-, Dokument- und Satztypen AWS AppSync konvertiert werden:

**Zeichenfolgetyp `S` **  
Ein einzelner Zeichenfolgewert. Ein DynamoDB-Zeichenkettenwert wird als Zeichenfolge zurückgegeben.  
Beispiel: DynamoDB hat den folgenden DynamoDB-Zeichenkettenwert zurückgegeben:  

```
{ "S" : "some string" }
```
AWS AppSync konvertiert ihn in eine Zeichenfolge:  

```
"some string"
```

**Zeichenfolgesatztyp `SS` **  
Ein Satz von Zeichenfolgewerten. Ein DynamoDB String Set-Wert wird als eine Liste von Zeichenketten zurückgegeben.  
Beispiel: DynamoDB hat den folgenden DynamoDB String Set-Wert zurückgegeben:  

```
{ "SS" : [ "first value", "second value", ... ] }
```
AWS AppSync konvertiert ihn in eine Liste von Zeichenketten:  

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

**Zahlentyp `N` **  
Ein einzelner numerischer Wert. Ein DynamoDB-Zahlenwert wird als Zahl zurückgegeben.  
Beispiel: DynamoDB hat den folgenden DynamoDB-Zahlenwert zurückgegeben:  

```
{ "N" : 1234 }
```
AWS AppSync wandelt ihn in eine Zahl um:  

```
1234
```

**Zahlensatztyp `NS` **  
Ein Satz von Zahlenwerten. Ein DynamoDB Number Set-Wert wird als eine Liste von Zahlen zurückgegeben.  
Beispiel: DynamoDB hat den folgenden DynamoDB Number Set-Wert zurückgegeben:  

```
{ "NS" : [ 67.8, 12.2, 70 ] }
```
AWS AppSync wandelt ihn in eine Liste von Zahlen um:  

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

**Binärtyp `B` **  
Ein Binärwert. Ein DynamoDB-Binärwert wird als Zeichenfolge zurückgegeben, die die Base64-Darstellung dieses Werts enthält.  
Wenn DynamoDB beispielsweise den folgenden DynamoDB-Binärwert zurückgegeben hat:  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
AWS AppSync konvertiert ihn in eine Zeichenfolge, die die Base64-Darstellung des Werts enthält:  

```
"SGVsbG8sIFdvcmxkIQo="
```
Beachten Sie, dass die Binärdaten im Base64-Codierungsschema codiert werden, wie in [RFC 4648](https://tools.ietf.org/html/rfc4648) und [RFC 2045](https://tools.ietf.org/html/rfc2045) angegeben.

**Binärsatztyp `BS` **  
Ein Satz von Binärwerten. Ein DynamoDB Binary Set-Wert wird als eine Liste von Zeichenketten zurückgegeben, die die Base64-Darstellung der Werte enthalten.  
Beispiel: DynamoDB hat den folgenden DynamoDB Binary Set-Wert zurückgegeben:  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
AWS AppSync konvertiert ihn in eine Liste von Zeichenketten, die die Base64-Darstellung der Werte enthalten:  

```
[ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ]
```
Beachten Sie, dass die Binärdaten im Base64-Codierungsschema codiert werden, wie in [RFC 4648](https://tools.ietf.org/html/rfc4648) und [RFC 2045](https://tools.ietf.org/html/rfc2045) angegeben.

**Boolescher Typ `BOOL` **  
Ein Boolescher Wert Ein boolescher DynamoDB-Wert wird als boolescher Wert zurückgegeben.  
Wenn DynamoDB beispielsweise den folgenden booleschen DynamoDB-Wert zurückgegeben hat:  

```
{ "BOOL" : true }
```
AWS AppSync wandelt ihn in einen booleschen Wert um:  

```
true
```

**Listentyp `L` **  
Eine Liste aller anderen unterstützten DynamoDB-Werte. Ein DynamoDB-Listenwert wird als Werteliste zurückgegeben, wobei jeder innere Wert ebenfalls konvertiert wird.  
Wenn DynamoDB beispielsweise den folgenden DynamoDB-Listenwert zurückgegeben hat:  

```
{ "L" : [
      { "S"  : "A string value" },
      { "N"  : 1 },
      { "SS" : [ "Another string value", "Even more string values!" ] }
   ]
}
```
AWS AppSync konvertiert ihn in eine Liste von konvertierten Werten:  

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

**Zuordnungstyp `M` **  
Eine key/value Sammlung aller anderen unterstützten DynamoDB-Werte. Ein DynamoDB-Zuordnungswert wird als JSON-Objekt zurückgegeben, wobei jeder Wert auch konvertiert key/value wird.  
Wenn DynamoDB beispielsweise den folgenden DynamoDB-Zuordnungswert zurückgegeben hat:  

```
{ "M" : {
      "someString" : { "S"  : "A string value" },
      "someNumber" : { "N"  : 1 },
      "stringSet"  : { "SS" : [ "Another string value", "Even more string values!" ] }
   }
}
```
AWS AppSync konvertiert ihn in ein JSON-Objekt:  

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

**Null-Typ `NULL` **  
Ein Null-Wert.  
Beispiel: DynamoDB hat den folgenden DynamoDB-Null-Wert zurückgegeben:  

```
{ "NULL" : null }
```
AWS AppSync wandelt ihn in einen Nullwert um:  

```
null
```

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

Wenn Sie Objekte in DynamoDB mithilfe der `Scan` Operationen `Query` und abfragen, können Sie optional a angeben, `filter` das die Ergebnisse auswertet und nur die gewünschten Werte zurückgibt.

Die Filtereigenschaft einer `Query` `Scan` OR-Anforderung hat die folgende Struktur:

```
type DynamoDBExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
};
```

Die Felder sind wie folgt definiert:

** `expression` **  
Der Abfrageausdruck. Weitere Informationen zum Schreiben von Filterausdrücken finden Sie in der Dokumentation zu DynamoDB QueryFilter und [https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html). Dieses Feld muss angegeben werden.

** `expressionNames` **  
Die Ersetzungen für Platzhalter der *Namen* von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Namensplatzhalter, der in der `expression` verwendet wird. Der Wert muss eine Zeichenfolge sein, die dem Attributnamen des Elements in DynamoDB entspricht. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Namen von Ausdrucksattributen gefüllt sein, die im `expression` verwendet werden.

** `expressionValues` **  
Die Ersetzungen für Platzhalter der *Werte* von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Wertplatzhalter, der im `expression` verwendet wird, und der Wert muss ein typisierter Wert sein. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (Anforderungszuordnung](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)). Dieser muss angegeben werden. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Werte von Ausdrucksattributen gefüllt sein, die im `expression` verwendet werden.

## Beispiel
<a name="js-id18"></a>

Das folgende Beispiel ist ein Filterabschnitt für eine Anfrage, in dem aus DynamoDB abgerufene Einträge nur zurückgegeben werden, wenn der Titel mit dem `title` Argument beginnt. 

Hier verwenden wir die`util.transform.toDynamoDBFilterExpression`, um automatisch einen Filter aus einem Objekt zu erstellen:

```
const filter = util.transform.toDynamoDBFilterExpression({
  title: { beginsWith: 'far away' },
});

const request = {};
request.filter = JSON.parse(filter);
```

Dadurch wird der folgende Filter generiert:

```
{
  "filter": {
    "expression": "(begins_with(#title,:title_beginsWith))",
    "expressionNames": { "#title": "title" },
    "expressionValues": {
      ":title_beginsWith": { "S": "far away" }
    }
  }
}
```

# Bedingungsausdrücke
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-expressions"></a>

Wenn Sie Objekte in DynamoDB mithilfe der Operationen,, und `DeleteItem` DynamoDB mutieren `PutItem``UpdateItem`, können Sie optional einen Bedingungsausdruck angeben, der steuert, ob die Anforderung erfolgreich sein soll oder nicht, basierend auf dem Zustand des Objekts, das sich bereits in DynamoDB befand, bevor der Vorgang ausgeführt wird.

Die AWS AppSync DynamoDB-Funktion ermöglicht die Angabe eines Bedingungsausdrucks in `PutItem``UpdateItem`, und `DeleteItem` Request-Objekten sowie eine Strategie, die befolgt werden kann, wenn die Bedingung fehlschlägt und das Objekt nicht aktualisiert wurde.

## Beispiel 1
<a name="js-id19"></a>

Das folgende `PutItem` Anforderungsobjekt hat keinen Bedingungsausdruck. Dadurch wird ein Element in DynamoDB platziert, auch wenn ein Element mit demselben Schlüssel bereits vorhanden ist, wodurch das vorhandene Element überschrieben wird.

```
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),
  };
}
```

## Beispiel 2
<a name="js-id20"></a>

Das folgende `PutItem` Objekt hat einen Bedingungsausdruck, der nur dann ermöglicht, dass der Vorgang erfolgreich ist, wenn ein Element mit demselben Schlüssel *nicht* in DynamoDB vorhanden ist.

```
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)" }
  };
}
```

Wenn die Zustandsprüfung fehlschlägt, gibt die AWS AppSync DynamoDB-Funktion standardmäßig einen Fehler für die Mutation aus.

Die AWS AppSync DynamoDB-Funktion bietet jedoch einige zusätzliche Funktionen, die Entwicklern helfen, einige häufig auftretende Randfälle zu bewältigen:
+ Wenn AWS AppSync DynamoDB-Funktionen feststellen können, dass der aktuelle Wert in DynamoDB dem gewünschten Ergebnis entspricht, wird der Vorgang so behandelt, als ob er trotzdem erfolgreich gewesen wäre.
+ Anstatt einen Fehler zurückzugeben, können Sie die Funktion so konfigurieren, dass sie eine benutzerdefinierte Lambda-Funktion aufruft, um zu entscheiden, wie die AWS AppSync DynamoDB-Funktion den Fehler behandeln soll.

Diese werden im Abschnitt [Behandlung eines Fehlers bei der Zustandsprüfung](#condition-check) ausführlicher beschrieben.

Weitere Informationen zu DynamoDB-Bedingungsausdrücken finden Sie in der [ ConditionExpressions DynamoDB-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html).

## Angabe einer Bedingung
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-specification"></a>

Die Objekte `PutItem``UpdateItem`, und `DeleteItem` request ermöglichen alle die Angabe eines optionalen `condition` Abschnitts. Wenn nicht angegeben, wird keine Bedingungsprüfung ausgeführt. Wenn angegeben, muss die Bedingung wahr sein, damit die Operation erfolgreich ausgeführt werden kann.

Ein `condition`-Abschnitt weist die folgende Struktur auf:

```
type ConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
  equalsIgnore?: string[];
  consistentRead?: boolean;
  conditionalCheckFailedHandler?: {
    strategy: 'Custom' | 'Reject';
    lambdaArn?: string;
  };
};
```

Die folgenden Felder geben die Bedingung an:

** `expression` **  
Der Aktualisierungsausdruck selbst. Weitere Informationen zum Schreiben von Bedingungsausdrücken finden Sie in der [DynamoDB-Dokumentation ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Dieses Feld muss angegeben werden.

** `expressionNames` **  
Die Ersetzungen für Platzhalter für Ausdrucksattributnamen in der Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Namensplatzhalter, der im *Ausdruck* verwendet wird, und der Wert muss eine Zeichenfolge sein, die dem Attributnamen des Elements in DynamoDB entspricht. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Namen von Ausdrucksattributen gefüllt sein, die im *Ausdruck* verwendet werden.

** `expressionValues` **  
Die Ersetzungen für Platzhalter der Werte von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Wertplatzhalter, der im Ausdruck verwendet wird, und der Wert muss ein typisierter Wert sein. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)Anforderungszuordnung). Dieser muss angegeben werden. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Werte von Ausdrucksattributen gefüllt sein, die im Ausdruck verwendet werden.

Die verbleibenden Felder teilen der AWS AppSync DynamoDB-Funktion mit, wie sie mit einem Fehler bei der Zustandsprüfung umgehen soll:

** `equalsIgnore` **  
Wenn eine Zustandsprüfung bei der Verwendung des `PutItem` Vorgangs fehlschlägt, vergleicht die AWS AppSync DynamoDB-Funktion das Element, das sich derzeit in DynamoDB befindet, mit dem Element, das sie zu schreiben versucht hat. Wenn sie identisch sind, wird die Operation behandelt, als wäre sie trotzdem erfolgreich ausgeführt worden. Sie können das `equalsIgnore` Feld verwenden, um eine Liste von Attributen anzugeben, die bei diesem Vergleich ignoriert AWS AppSync werden sollen. Wenn der einzige Unterschied beispielsweise ein `version` Attribut war, wird der Vorgang so behandelt, als ob er erfolgreich war. Dies ist ein optionales Feld.

** `consistentRead` **  
Wenn eine Zustandsprüfung fehlschlägt, AWS AppSync wird der aktuelle Wert des Elements mithilfe eines stark konsistenten Lesevorgangs von DynamoDB abgerufen. Sie können dieses Feld verwenden, um die AWS AppSync DynamoDB-Funktion anzuweisen, stattdessen einen eventuell konsistenten Lesevorgang zu verwenden. Dieses Feld ist optional und standardmäßig auf `true` gesetzt.

** `conditionalCheckFailedHandler` **  
In diesem Abschnitt können Sie angeben, wie die AWS AppSync DynamoDB-Funktion einen Fehler bei der Zustandsprüfung behandelt, nachdem der aktuelle Wert in DynamoDB mit dem erwarteten Ergebnis verglichen wurde. Dieser Abschnitt ist optional. Wenn nicht angegeben, wird standardmäßig eine Strategie von `Reject` verwendet.    
** `strategy` **  
Die Strategie, die die AWS AppSync DynamoDB-Funktion verfolgt, nachdem sie den aktuellen Wert in DynamoDB mit dem erwarteten Ergebnis verglichen hat. Dieses Feld ist erforderlich und besitzt die folgenden möglichen Werte:    
** `Reject` **  
Die Mutation schlägt fehl und der GraphQL-Antwort wird ein Fehler hinzugefügt.  
** `Custom` **  
Die AWS AppSync DynamoDB-Funktion ruft eine benutzerdefinierte Lambda-Funktion auf, um zu entscheiden, wie mit dem Fehler bei der Zustandsprüfung umgegangen werden soll. Wenn die `strategy` auf `Custom` gesetzt ist, muss das `lambdaArn`-Feld den ARN der aufzurufenden Lambda-Funktion enthalten.  
** `lambdaArn` **  
Der ARN der aufzurufenden Lambda-Funktion, der bestimmt, wie die AWS AppSync DynamoDB-Funktion den Fehler bei der Zustandsprüfung behandeln soll. Dieses Feld muss nur angegeben werden, wenn `strategy` auf `Custom` festgelegt ist. Weitere Informationen zur Verwendung dieser Funktion finden Sie unter [Behandlung eines](#condition-check) Fehlers bei der Zustandsprüfung.

## Behandlung eines Fehlers bei der Zustandsprüfung
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-handling"></a>

Wenn eine Zustandsprüfung fehlschlägt, kann die AWS AppSync DynamoDB-Funktion den Fehler für die Mutation und den aktuellen Wert des Objekts mithilfe des `util.appendError` Dienstprogramms weitergeben. Die AWS AppSync DynamoDB-Funktion bietet jedoch einige zusätzliche Funktionen, die Entwicklern helfen, einige häufig auftretende Randfälle zu bewältigen:
+ Wenn AWS AppSync DynamoDB-Funktionen feststellen können, dass der aktuelle Wert in DynamoDB dem gewünschten Ergebnis entspricht, wird der Vorgang so behandelt, als ob er trotzdem erfolgreich gewesen wäre.
+ Anstatt einen Fehler zurückzugeben, können Sie die Funktion so konfigurieren, dass sie eine benutzerdefinierte Lambda-Funktion aufruft, um zu entscheiden, wie die AWS AppSync DynamoDB-Funktion den Fehler behandeln soll.

Das Flussdiagramm für diesen Prozess ist:

![\[Flowchart showing process for transforming requests with mutation attempts and value checks.\]](http://docs.aws.amazon.com/de_de/appsync/latest/devguide/images/DynamoDB-condition-check-failure-handling.png)


### Es wird geprüft, ob das gewünschte Ergebnis vorliegt
<a name="js-checking-for-the-desired-result"></a>

Wenn die Zustandsprüfung fehlschlägt, führt die AWS AppSync DynamoDB-Funktion eine `GetItem` DynamoDB-Anforderung aus, um den aktuellen Wert des Elements von DynamoDB abzurufen. Standardmäßig wird ein Strongly Consistent-Lesevorgang verwendet, jedoch kann dies mit dem `consistentRead`-Feld im `condition`-Block konfiguriert werden, und mit dem erwarteten Ergebnis verglichen:
+ Für den `PutItem` Vorgang vergleicht die AWS AppSync DynamoDB-Funktion den aktuellen Wert mit dem Wert, den sie zu schreiben versucht hat, und schließt alle unter aufgelisteten Attribute aus dem Vergleich `equalsIgnore` aus. Wenn die Elemente identisch sind, wird der Vorgang als erfolgreich behandelt und das Element zurückgegeben, das von DynamoDB abgerufen wurde. Andernfalls wird die konfigurierte Strategie verfolgt.

  Wenn das `PutItem` Anforderungsobjekt beispielsweise wie folgt aussah:

  ```
  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']
      }
    };
  }
  ```

  Und das Element, das sich derzeit in DynamoDB befindet, wie folgt ausgesehen hat:

  ```
  {
     "id" : { "S" : "1" },
     "name" : { "S" : "Steve" },
     "version" : { "N" : 8 }
  }
  ```

  Die AWS AppSync DynamoDB-Funktion würde das Element, das sie schreiben wollte, mit dem aktuellen Wert vergleichen und feststellen, dass der einzige Unterschied das `version` Feld war. Da sie jedoch so konfiguriert ist, dass sie das `version` Feld ignoriert, behandelt sie den Vorgang als erfolgreich und gibt das Element zurück, das von DynamoDB abgerufen wurde.
+ Für den `DeleteItem` Vorgang überprüft die AWS AppSync DynamoDB-Funktion, ob ein Element von DynamoDB zurückgegeben wurde. Wenn kein Element zurückgegeben wurde, behandelt er die Operation als erfolgreich. Andernfalls wird die konfigurierte Strategie verfolgt.
+ Für den `UpdateItem` Vorgang verfügt die AWS AppSync DynamoDB-Funktion nicht über genügend Informationen, um festzustellen, ob das Element, das sich derzeit in DynamoDB befindet, dem erwarteten Ergebnis entspricht und daher der konfigurierten Strategie folgt.

Wenn der aktuelle Status des Objekts in DynamoDB vom erwarteten Ergebnis abweicht, folgt die AWS AppSync DynamoDB-Funktion der konfigurierten Strategie, entweder die Mutation zurückzuweisen oder eine Lambda-Funktion aufzurufen, um zu bestimmen, was als Nächstes zu tun ist.

### Wir folgen der Strategie „Ablehnen“
<a name="js-following-the-reject-strategy"></a>

Wenn die `Reject` Strategie befolgt wird, gibt die AWS AppSync DynamoDB-Funktion einen Fehler für die Mutation zurück.

Angenommen, Sie haben folgende Mutationsanforderung:

```
mutation {
    updatePerson(id: 1, name: "Steve", expectedVersion: 1) {
        Name
        theVersion
    }
}
```

Wenn das von DynamoDB zurückgegebene Element wie folgt aussieht:

```
{
   "id" : { "S" : "1" },
   "name" : { "S" : "Steve" },
   "version" : { "N" : 8 }
}
```

Und der Response-Handler der Funktion sieht wie folgt aus:

```
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
}
```

Die GraphQL-Antwort sieht wie folgt aus:

```
{
  "data": null,
  "errors": [
    {
      "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ)"
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      ...
    }
  ]
}
```

Beachten Sie auch, dass, wenn bei einer erfolgreichen Mutation alle Felder im zurückgegebenen Objekt von anderen Resolvern ausgefüllt werden, diese nicht auf den Resolver angewendet werden, wenn das Objekt im `error`-Abschnitt zurückgegeben wird.

### Folgen Sie der „benutzerdefinierten“ Strategie
<a name="js-following-the-custom-strategy"></a>

Wenn Sie der `Custom` Strategie folgen, ruft die AWS AppSync DynamoDB-Funktion eine Lambda-Funktion auf, um zu entscheiden, was als Nächstes zu tun ist. Die Lambda-Funktion wählt eine der folgenden Optionen aus:
+  Die Mutation `reject`. Dadurch wird die AWS AppSync DynamoDB-Funktion angewiesen`Reject`, sich wie bei der konfigurierten Strategie zu verhalten und einen Fehler für die Mutation und den aktuellen Wert des Objekts in DynamoDB zurückzugeben, wie im vorherigen Abschnitt beschrieben.
+  Die Mutation `discard`. Dadurch wird die AWS AppSync DynamoDB-Funktion angewiesen, den Fehler bei der Zustandsprüfung stillschweigend zu ignorieren und den Wert in DynamoDB zurückzugeben.
+  Die Mutation `retry`. Dadurch wird die AWS AppSync DynamoDB-Funktion angewiesen, die Mutation mit einem neuen Anforderungsobjekt erneut zu versuchen.

 **Die Lambda-Aufrufanforderung**

Die AWS AppSync DynamoDB-Funktion ruft die in der angegebene Lambda-Funktion auf. `lambdaArn` Er verwendet die gleiche `service-role-arn`-Konfiguration für die Datenquelle. Die Nutzlast des Aufrufs hat die folgende Struktur:

```
{
    "arguments": { ... },
    "requestMapping": {... },
    "currentValue": { ... },
    "resolver": { ... },
    "identity": { ... }
}
```

Die Felder sind wie folgt definiert:

** `arguments` **  
Die Argumente aus der GraphQL-Mutation. Dies entspricht den Argumenten, die für das Anforderungsobjekt in verfügbar sind. `context.arguments`

** `requestMapping` **  
Das Anforderungsobjekt für diesen Vorgang.

** `currentValue` **  
Der aktuelle Wert des Objekts in DynamoDB.

** `resolver` **  
Informationen über den AWS AppSync Resolver oder die Funktion.

** `identity` **  
Informationen über den Aufrufer. Dies entspricht den Identitätsinformationen, die dem Anforderungsobjekt in `context.identity` zur Verfügung stehen.

Ein vollständiges Beispiel für die Nutzlast:

```
{
    "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"
    }
}
```

 **Die Lambda-Aufrufantwort** 

Die Lambda-Funktion kann die Nutzlast des Aufrufs überprüfen und jede Geschäftslogik anwenden, um zu entscheiden, wie die AWS AppSync DynamoDB-Funktion mit dem Fehler umgehen soll. Es gibt drei Optionen für den Umgang mit dem Bedingungsprüfungsfehler:
+  Die Mutation `reject`. Die Antwortnutzlast für diese Option muss diese Struktur aufweisen:

  ```
  {
      "action": "reject"
  }
  ```

  Dadurch wird die AWS AppSync DynamoDB-Funktion angewiesen`Reject`, sich wie bei der konfigurierten Strategie zu verhalten und einen Fehler für die Mutation und den aktuellen Wert des Objekts in DynamoDB zurückzugeben, wie im obigen Abschnitt beschrieben.
+  Die Mutation `discard`. Die Antwortnutzlast für diese Option muss diese Struktur aufweisen:

  ```
  {
      "action": "discard"
  }
  ```

  Dadurch wird die AWS AppSync DynamoDB-Funktion angewiesen, den Fehler bei der Zustandsprüfung stillschweigend zu ignorieren und den Wert in DynamoDB zurückzugeben.
+  Die Mutation `retry`. Die Antwortnutzlast für diese Option muss diese Struktur aufweisen:

  ```
  {
      "action": "retry",
      "retryMapping": { ... }
  }
  ```

  Dadurch wird die AWS AppSync DynamoDB-Funktion angewiesen, die Mutation mit einem neuen Anforderungsobjekt erneut zu versuchen. Die Struktur des `retryMapping` Abschnitts hängt von der DynamoDB-Operation ab und ist eine Teilmenge des vollständigen Anforderungsobjekts für diesen Vorgang.

  Für `PutItem` weist der `retryMapping`-Abschnitt die folgende Struktur auf. Eine Beschreibung des `attributeValues` Felds finden Sie unter. [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
      }
  }
  ```

  Für `UpdateItem` weist der `retryMapping`-Abschnitt die folgende Struktur auf. Eine Beschreibung des `update` Abschnitts finden Sie unter [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
      }
  }
  ```

  Für `DeleteItem` weist der `retryMapping`-Abschnitt die folgende Struktur auf.

  ```
  {
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  Es ist nicht möglich, eine andere Operation oder einen anderen Schlüssel anzugeben. Die AWS AppSync DynamoDB-Funktion erlaubt nur Wiederholungen derselben Operation für dasselbe Objekt. Beachten Sie auch, dass der Abschnitt `condition` nicht zulässt, dass ein `conditionalCheckFailedHandler` angegeben wird. Schlägt der Wiederholungsversuch fehl, folgt die AWS AppSync DynamoDB-Funktion der Strategie. `Reject`

Hier sehen Sie ein Beispiel für eine Lambda-Funktion zum Umgang mit einer fehlgeschlagenen `PutItem`-Anforderung. Die Geschäftslogik prüft, wer den Aufruf ausgeführt hat. Wenn es von erstellt wurde`jeffTheAdmin`, wiederholt es die Anfrage und aktualisiert das `version` und `expectedVersion` aus dem Element, das sich derzeit in DynamoDB befindet. Andernfalls wird die Mutation ablehnt.

```
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)
};
```

# Ausdrücke für Transaktionsbedingungen
<a name="js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions"></a>

Ausdrücke für Transaktionsbedingungen sind in Anfragen aller vier Arten von Operationen in verfügbar`TransactWriteItems`, nämlich `PutItem``DeleteItem`,`UpdateItem`, und`ConditionCheck`.

Für `PutItem` `DeleteItem``UpdateItem`, und ist der Ausdruck für die Transaktionsbedingung optional. Für `ConditionCheck` ist der Ausdruck der Transaktionsbedingung erforderlich.

## Beispiel 1
<a name="js-id22"></a>

Der folgende Anforderungshandler für `DeleteItem` Transaktionsfunktionen hat keinen Bedingungsausdruck. Infolgedessen wird das Element in DynamoDB gelöscht.

```
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 }),
      }
    ],
  };
}
```

## Beispiel 2
<a name="js-id23"></a>

Der folgende Anforderungshandler für `DeleteItem` Transaktionsfunktionen verfügt über einen Ausdruck für eine Transaktionsbedingung, mit dem der Vorgang nur dann erfolgreich ausgeführt werden kann, wenn der Autor dieses Beitrags einem bestimmten Namen entspricht.

```
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 },
        }),
      }
    ],
  };
}
```

Wenn die Bedingungsprüfung fehlschlägt, führt dies zu `TransactionCanceledException`, und die Fehlerdetails werden in `ctx.result.cancellationReasons` zurückgegeben. Beachten Sie, dass standardmäßig das alte Element in DynamoDB zurückgegeben wird, bei dem die Zustandsprüfung fehlgeschlagen ist. `ctx.result.cancellationReasons`

## Angabe einer Bedingung
<a name="js-id24"></a>

Die Objekte `PutItem``UpdateItem`, und `DeleteItem` request ermöglichen alle die Angabe eines optionalen `condition` Abschnitts. Wenn nicht angegeben, wird keine Bedingungsprüfung ausgeführt. Wenn angegeben, muss die Bedingung wahr sein, damit die Operation erfolgreich ausgeführt werden kann. Der `ConditionCheck` muss einen `condition`-Abschnitt haben, der angegeben werden soll. Die Bedingung muss erfüllt sein, damit die gesamte Transaktion erfolgreich ist.

Ein `condition`-Abschnitt weist die folgende Struktur auf:

```
type TransactConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string };
  expressionValues?: { [key: string]: string };
  returnValuesOnConditionCheckFailure: boolean;
};
```

Die folgenden Felder geben die Bedingung an:

** `expression` **  
Der Aktualisierungsausdruck selbst. Weitere Informationen zum Schreiben von Bedingungsausdrücken finden Sie in der [DynamoDB-Dokumentation ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Dieses Feld muss angegeben werden.

** `expressionNames` **  
Die Ersetzungen für Platzhalter für Ausdrucksattributnamen in der Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Namensplatzhalter, der im *Ausdruck* verwendet wird, und der Wert muss eine Zeichenfolge sein, die dem Attributnamen des Elements in DynamoDB entspricht. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Namen von Ausdrucksattributen gefüllt sein, die im *Ausdruck* verwendet werden.

** `expressionValues` **  
Die Ersetzungen für Platzhalter der Werte von Ausdrucksattributen in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Wertplatzhalter, der im Ausdruck verwendet wird, und der Wert muss ein typisierter Wert sein. Weitere Informationen zur Angabe eines „typisierten Werts“ finden Sie unter [Typsystem (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)Anforderungszuordnung). Dieser muss angegeben werden. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter der Werte von Ausdrucksattributen gefüllt sein, die im Ausdruck verwendet werden.

** `returnValuesOnConditionCheckFailure` **  
Geben Sie an, ob das Element in DynamoDB zurückgeholt werden soll, wenn eine Zustandsprüfung fehlschlägt. Das abgerufene Element befindet sich in `ctx.result.cancellationReasons[<index>].item`, wobei der `<index>` Index des Anforderungselements ist, durch das die Bedingungsprüfung fehlgeschlagen ist. Dieser Wert ist standardmäßig auf true gesetzt.

# Projektionen
<a name="js-aws-appsync-resolver-reference-dynamodb-projections"></a>

Wenn Sie Objekte in DynamoDB mithilfe der `TransactGetItems` Operationen`GetItem`,`Scan`, `Query``BatchGetItem`, und lesen, können Sie optional eine Projektion angeben, die die gewünschten Attribute identifiziert. Die Projektionseigenschaft hat die folgende Struktur, die Filtern ähnelt: 

```
type DynamoDBExpression = {
  expression: string;
  expressionNames?: { [key: string]: string}
};
```

Die Felder sind wie folgt definiert:

** `expression` **  
Der Projektionsausdruck, bei dem es sich um eine Zeichenfolge handelt. Zum Abrufen eines einzelnen Attributs geben Sie seinen Namen an. Bei mehreren Attributen müssen die Namen durch Kommas getrennte Werte sein. Weitere Informationen zum Schreiben von Projektionsausdrücken finden Sie in der Dokumentation zu [DynamoDB-Projektionsausdrücken](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html). Dies ist ein Pflichtfeld. 

** `expressionNames` **  
Die Ersetzungen für Platzhalter für *Ausdrucksattributnamen* in Form von Schlüssel-Wert-Paaren. Der Schlüssel entspricht einem Namensplatzhalter, der in der `expression` verwendet wird. Der Wert muss eine Zeichenfolge sein, die dem Attributnamen des Elements in DynamoDB entspricht. Dieses Feld ist optional und sollte nur mit Ersetzungen für Platzhalter für Ausdrucksattributnamen gefüllt werden, die in der verwendet werden. `expression` Weitere Informationen zu `expressionNames` finden Sie in der [DynamoDB-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html). 

## Beispiel 1
<a name="js-id22"></a>

Das folgende Beispiel ist ein Projektionsabschnitt für eine JavaScript Funktion, in der nur die Attribute `author` und von DynamoDB zurückgegeben `id` werden:

```
projection : {
    expression : "#author, id",
    expressionNames : {
        "#author" : "author"
    }
}
```

**Tipp**  
Sie können auf Ihren GraphQL-Anforderungsauswahlsatz zugreifen, indem [selectionSetList](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html#aws-appsync-resolver-context-reference-info-js)Sie. In diesem Feld können Sie Ihren Projektionsausdruck Ihren Anforderungen entsprechend dynamisch gestalten.

**Anmerkung**  
Bei der Verwendung von Projektionsausdrücken mit den `Scan` Operationen `Query` und `select` muss der Wert für sein`SPECIFIC_ATTRIBUTES`. Weitere Informationen finden Sie in der [DynamoDB-Dokumentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-Select).

# AWS AppSync JavaScript Resolver-Funktionsreferenz für OpenSearch
<a name="resolver-reference-elasticsearch-js"></a>

Mit dem AWS AppSync Resolver für Amazon OpenSearch Service können Sie GraphQL verwenden, um Daten in vorhandenen OpenSearch Service-Domains in Ihrem Konto zu speichern und abzurufen. Dieser Resolver ermöglicht es Ihnen, eine eingehende GraphQL-Anfrage einer Serviceanfrage zuzuordnen und die OpenSearch OpenSearch Serviceantwort dann wieder GraphQL zuzuordnen. In diesem Abschnitt werden die Funktionsanforderungs- und Antworthandler für die unterstützten Serviceoperationen beschrieben. OpenSearch 

## Anforderung
<a name="request-js"></a>

Die meisten OpenSearch Serviceanforderungsobjekte haben eine gemeinsame Struktur, bei der sich nur wenige Teile ändern. Im folgenden Beispiel wird eine Suche in einer OpenSearch Service-Domäne ausgeführt, in der Dokumente vom Typ sind `post` und unter `id` der sie indexiert sind. Die Suchparameter sind im `body`-Abschnitt definiert, viele der gemeinsamen Abfragebestimmungen sind im `query`-Feld definiert. In diesem Beispiel wird nach Dokumenten gesucht, die `"Nadia"`, `"Bailey"` oder beides enthalten, und zwar in dem `author`-Feld eines Dokuments:

```
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' } },
            ],
          },
        },
      },
    },
  };
}
```

## Antwort
<a name="response-mapping-template"></a>

Wie bei anderen Datenquellen sendet OpenSearch Service eine Antwort an AWS AppSync , die in GraphQL konvertiert werden muss.

Die meisten GraphQL-Abfragen suchen nach dem `_source` Feld aus einer OpenSearch Serviceantwort. Da Sie Suchen durchführen können, um entweder ein einzelnes Dokument oder eine Liste von Dokumenten zurückzugeben, gibt es in OpenSearch Service zwei gängige Antwortmuster:

 **Liste der Ergebnisse** 

```
export function response(ctx) {
  const entries = [];
  for (const entry of ctx.result.hits.hits) {
    entries.push(entry['_source']);
  }
  return entries;
}
```

 **Einzelnes Element** 

```
export function response(ctx) {
  return ctx.result['_source']
}
```

## `operation` field
<a name="operation-field"></a>

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

HTTP-Methode oder Verb (GET, POST, PUT, HEAD oder DELETE), das AWS AppSync an die OpenSearch Service-Domäne sendet. Der Schlüssel und der Wert müssen beide Strings sein.

```
"operation" : "PUT"
```

## `path` field
<a name="path-field"></a>

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

Der Suchpfad für eine OpenSearch Serviceanfrage von AWS AppSync. Dies bildet eine URL für das HTTP-Verb der Operation. Der Schlüssel und der Wert müssen beide Strings sein.

```
"path" : "/indexname/type"

"path" : "/indexname/type/_search"
```

Wenn der Anforderungshandler ausgewertet wird, wird dieser Pfad als Teil der HTTP-Anfrage gesendet, einschließlich der OpenSearch Dienstdomäne. Das vorherige Beispiel kann dann beispielsweise so aussehen:

```
GET https://opensearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
```

## `params` field
<a name="params-field"></a>

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

Wird verwendet, um anzugeben, welche Aktion Ihre Suche durchführt, meistens indem der **Abfragewert** in den **Body** setzt. Es gibt jedoch einige andere Funktionen, die konfiguriert werden können, wie z. B. die Formatierung von Antworten.
+  **Header** 

  Die Header-Informationen, wie beispielsweise Schlüssel-Wert-Paare. Der Schlüssel und der Wert müssen beide Strings sein. Beispiel:

  ```
  "headers" : {
      "Content-Type" : "application/json"
  }
  ```

   
**Anmerkung**  
AWS AppSync unterstützt derzeit nur JSON als`Content-Type`.
+  **queryString** 

  Schlüssel-Wert-Paare, die allgemeine Optionen angeben, z. B. Codeformatierung für JSON-Antworten. Der Schlüssel und der Wert müssen beide Strings sein. Wenn Sie beispielsweise ein gut formatiertes JSON-Format haben möchten, geben Sie Folgendes an:

  ```
  "queryString" : {
      "pretty" : "true"
  }
  ```
+  **body** 

  Dies ist der Hauptteil Ihrer Anfrage, der es ermöglicht AWS AppSync , eine wohlgeformte Suchanfrage für Ihre OpenSearch Service-Domain zu erstellen. Der Schlüssel muss ein aus einem Objekt bestehender String sein. Ein paar Beispiele werden unten gezeigt.

 **Beispiel 1** 

Rückgabe aller Dokumente, die die Stadt „Seattle“ enthalten:

```
export function request(ctx) {
  return {
    operation: 'GET',
    path: '/id/post/_search',
    params: {
      headers: {},
      queryString: {},
      body: { from: 0, size: 50, query: { match: { city: 'seattle' } } },
    },
  };
}
```

 **Beispiel 2** 

Rückgabe aller Dokumente, die „Washington“ als Stadt oder Staat enthalten:

```
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'] },
        },
      },
    },
  };
}
```

## Variablen übergeben
<a name="passing-variables"></a>

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

Sie können Variablen auch als Teil der Auswertung in Ihrem Request-Handler übergeben. Angenommen, Sie hatten die folgende GraphQL-Abfrage:

```
query {
    searchForState(state: "washington"){
        ...
    }
}
```

Der Funktionsanforderungshandler könnte der folgende sein:

```
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 Resolver-Funktionsreferenz für Lambda
<a name="resolver-reference-lambda-js"></a>

Sie können AWS AppSync Funktionen und Resolver verwenden, um Lambda-Funktionen in Ihrem Konto aufzurufen. Sie können Ihre Anforderungs-Payloads und die Antwort Ihrer Lambda-Funktionen gestalten, bevor Sie sie an Ihre Clients zurückgeben. Sie können auch die Art der Operation angeben, die in Ihrem Anforderungsobjekt ausgeführt werden soll. In diesem Abschnitt werden die Anfragen für die unterstützten Lambda-Operationen beschrieben.

## Objekt anfordern
<a name="request-object-js"></a>

Das Lambda-Anforderungsobjekt verarbeitet Felder, die sich auf Ihre Lambda-Funktion beziehen:

```
export type LambdaRequest = {
  operation: 'Invoke' | 'BatchInvoke';
  invocationType?: 'RequestResponse' | 'Event';
  payload: unknown;
};
```

Hier ist ein Beispiel, das eine `invoke` Operation verwendet, deren Nutzdaten das `getPost` Feld aus einem GraphQL-Schema zusammen mit den Argumenten aus dem Kontext sind:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Das gesamte Mapping-Dokument wird als Eingabe für Ihre Lambda-Funktion übergeben, sodass das vorherige Beispiel nun wie folgt aussieht:

```
{
  "operation": "Invoke",
  "payload": {
    "field": "getPost",
    "arguments": {
      "input": {
        "id": "postId1",
      }
    }
  }
}
```

### Operation
<a name="operation-js"></a>

Mit der Lambda-Datenquelle können Sie zwei Operationen im `operation` Feld definieren: `Invoke` und`BatchInvoke`. Die `Invoke` Operation teilt mit AWS AppSync , dass Sie Ihre Lambda-Funktion für jeden GraphQL-Feldresolver aufrufen sollen. `BatchInvoke`weist AWS AppSync an, Anfragen für das aktuelle GraphQL-Feld zu stapeln. Das Feld `operation` ist ein Pflichtfeld.

Denn `Invoke` die aufgelöste Anfrage entspricht der Eingabe-Payload der Lambda-Funktion. Lassen Sie uns das obige Beispiel ändern:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Dies wird gelöst und an die Lambda-Funktion übergeben, die etwa so aussehen könnte:

```
{
  "operation": "Invoke",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

Denn `BatchInvoke` die Anfrage wird auf jeden Field Resolver im Batch angewendet. Führt aus Gründen der Übersichtlichkeit alle `payload` Anforderungswerte zu einer Liste unter einem einzigen Objekt zusammen, das dem Anforderungsobjekt entspricht. AWS AppSync Der folgende Beispiel-Request-Handler zeigt die Zusammenführung:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: ctx,
  };
}
```

Diese Anfrage wird ausgewertet und im folgenden Mapping-Dokument aufgelöst:

```
{
  "operation": "BatchInvoke",
  "payload": [
    {...}, // context for batch item 1
    {...}, // context for batch item 2
    {...}  // context for batch item 3
  ]
}
```

Jedes Element der `payload` Liste entspricht einem einzelnen Batch-Element. Es wird auch erwartet, dass die Lambda-Funktion eine listenförmige Antwort zurückgibt, die der Reihenfolge der in der Anfrage gesendeten Elemente entspricht:

```
[
  { "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
]
```

### Nutzlast
<a name="payload-js"></a>

Das `payload` Feld ist ein Container, der verwendet wird, um Daten an die Lambda-Funktion zu übergeben. Wenn das `operation` Feld auf gesetzt ist`BatchInvoke`, werden AWS AppSync die vorhandenen `payload` Werte in eine Liste zusammengefasst. Das Feld `payload` ist optional.

### Aufruftyp
<a name="async-invocation-type-js"></a>

Mit der Lambda-Datenquelle können Sie zwei Aufruftypen definieren: `RequestResponse` und. `Event` [Die Aufruftypen sind synonym mit den in der Lambda-API definierten Aufruftypen.](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) Mit dem `RequestResponse` AWS AppSync Aufruftyp können Sie Ihre Lambda-Funktion synchron aufrufen, um auf eine Antwort zu warten. Der `Event` Aufruf ermöglicht es Ihnen, Ihre Lambda-Funktion asynchron aufzurufen. Weitere Informationen darüber, wie Lambda Anfragen vom `Event` Aufruftyp verarbeitet, finden Sie unter [Asynchroner](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html) Aufruf. Das Feld `invocationType` ist optional. Wenn dieses Feld nicht in der Anfrage enthalten ist, AWS AppSync wird standardmäßig der Aufruftyp verwendet. `RequestResponse`

Für jedes `invocationType` Feld entspricht die aufgelöste Anfrage der Eingabe-Payload der Lambda-Funktion. Lassen Sie uns das obige Beispiel ändern:

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    invocationType: 'Event',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Dies wird gelöst und an die Lambda-Funktion übergeben, die etwa so aussehen könnte:

```
{
  "operation": "Invoke",
  "invocationType": "Event",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

Wenn der `BatchInvoke` Vorgang in Verbindung mit dem `Event` Aufruftypfeld verwendet wird, AWS AppSync führt er den Feldauflöser auf die oben beschriebene Weise zusammen, und die Anforderung wird als asynchrones Ereignis an Ihre Lambda-Funktion übergeben, `payload` wobei es sich um eine Werteliste handelt. Die Antwort auf eine Anfrage vom `Event` Aufruftyp führt zu einem `null` Wert ohne Antworthandler:

```
{
  "data": {
    "field": null
  }
}
```

Wir empfehlen, das Resolver-Caching für Resolver vom `Event` Aufruftyp zu deaktivieren, da diese bei einem Cache-Treffer nicht an Lambda gesendet würden.

## Antwortobjekt
<a name="response-object-js"></a>

Wie bei anderen Datenquellen sendet Ihre Lambda-Funktion eine Antwort darauf AWS AppSync , die in einen GraphQL-Typ konvertiert werden muss. Das Ergebnis der Lambda-Funktion ist in der `context` Ergebniseigenschaft (`context.result`) enthalten.

Wenn die Form Ihrer Lambda-Funktionsantwort mit der Form des GraphQL-Typs übereinstimmt, können Sie die Antwort mit dem folgenden Funktionsantwort-Handler weiterleiten:

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

Es gibt keine erforderlichen Felder oder Formbeschränkungen, die für das Antwortobjekt gelten. Da GraphQL jedoch stark typisiert ist, muss die aufgelöste Antwort dem erwarteten GraphQL-Typ entsprechen.

## Batch-Antwort mit Lambda-Funktion
<a name="aws-appsync-resolver-reference-lambda-batched-response-js"></a>

Wenn das `operation`-Feld auf `BatchInvoke` festgelegt ist, erwartet AWS AppSync eine Liste mit Elementen aus der Lambda-Funktion. Damit jedes Ergebnis AWS AppSync dem ursprünglichen Anforderungselement zugeordnet werden kann, muss die Antwortliste in Größe und Reihenfolge übereinstimmen. Es ist zulässig, `null` Elemente in der Antwortliste zu haben; sie `ctx.result` wird entsprechend auf *Null* gesetzt.

# AWS AppSync JavaScript Resolver-Funktionsreferenz für die EventBridge Datenquelle
<a name="resolver-reference-eventbridge-js"></a>

Die mit der EventBridge Datenquelle verwendete AWS AppSync Resolver-Funktion Request and Response ermöglicht es Ihnen, benutzerdefinierte Ereignisse an den EventBridge Amazon-Bus zu senden.

## Anforderung
<a name="request-js"></a>

Mit dem Request-Handler können Sie mehrere benutzerdefinierte Ereignisse an einen EventBridge Event-Bus senden:

```
export function request(ctx) {
  return {
    "operation" : "PutEvents",
    "events" : [{}]
  }
}
```

Eine EventBridge `PutEvents` Anfrage hat die folgende Typdefinition:

```
type PutEventsRequest = {
  operation: 'PutEvents'
  events: {
    source: string
    detail: { [key: string]: any }
    detailType: string
    resources?: string[]
    time?: string // RFC3339 Timestamp format
  }[]
}
```

## Antwort
<a name="response-js"></a>

Wenn der `PutEvents` Vorgang erfolgreich ist, EventBridge ist die Antwort von enthalten in`ctx.result`:

```
export function response(ctx) {
  if(ctx.error)
    util.error(ctx.error.message, ctx.error.type, ctx.result)
  else
    return ctx.result
}
```

Fehler, die bei der Ausführung von `PutEvents` Vorgängen wie `InternalExceptions` oder auftreten`Timeouts`, werden in angezeigt`ctx.error`. Eine Liste der EventBridge häufigsten Fehler finden Sie in der [Referenz zu EventBridge häufigen Fehlern](https://docs.aws.amazon.com/eventbridge/latest/APIReference/CommonErrors.html).

Sie `result` werden die folgende Typdefinition haben:

```
type PutEventsResult = {
  Entries: {
    ErrorCode: string
    ErrorMessage: string
    EventId: string
  }[]
  FailedEntryCount: number
}
```
+ **Einträge**

  Die Ergebnisse des aufgenommenen Ereignisses, sowohl erfolgreich als auch erfolglos. Wenn die Aufnahme erfolgreich war, enthält der Eintrag das`EventID`. Andernfalls können Sie das `ErrorCode` und verwenden, `ErrorMessage` um das Problem mit dem Eintrag zu identifizieren.

  Für jeden Datensatz entspricht der Index des Antwortelements dem Index im Anforderungsarray.
+ **FailedEntryCount**

  Die Anzahl der fehlgeschlagenen Einträge. Dieser Wert wird als Ganzzahl dargestellt.

Weitere Hinweise zur Antwort von `PutEvents` finden Sie unter [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html#API_PutEvents_ResponseElements).

**Beispiel für Antwort 1**

Das folgende Beispiel zeigt einen `PutEvents` Vorgang mit zwei erfolgreichen Ereignissen:

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        }
    ],
    "FailedEntryCount" : 0
}
```

**Beispiel für eine Antwort 2**

Das folgende Beispiel zeigt einen `PutEvents` Vorgang mit drei Ereignissen, zwei Erfolgen und einem Fehlschlag:

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        },
        {
            "ErrorCode" : "SampleErrorCode",
            "ErrorMessage" : "Sample Error Message"
        }
    ],
    "FailedEntryCount" : 1
}
```

## `PutEvents`-Felder
<a name="putevents-field"></a>

`PutEvents`enthält die folgenden Felder für Zuordnungsvorlagen:
+ **Version**

  Das `version` Feld ist allen Vorlagen für die Zuordnung von Anfragen gemeinsam und definiert die Version, die die Vorlage verwendet. Dies ist ein Pflichtfeld. Der Wert `2018-05-29` ist die einzige Version, die für die EventBridge Zuordnungsvorlagen unterstützt wird.
+ **Operation**

  Die einzige unterstützte Operation ist`PutEvents`. Mit diesem Vorgang können Sie Ihrem Event-Bus benutzerdefinierte Ereignisse hinzufügen.
+ **-**-Ereignisse

  Eine Reihe von Ereignissen, die dem Event-Bus hinzugefügt werden. Dieses Array sollte eine Zuordnung von 1 bis 10 Elementen haben.

  Das `Event`-Objekt enthält folgende Felder:
  + `"source"`: Eine Zeichenfolge, die die Quelle des Ereignisses definiert.
  + `"detail"`: Ein JSON-Objekt, mit dem Sie Informationen über das Ereignis anhängen können. Dieses Feld kann eine leere Map (`{ }`) sein.
  + `"detailType`: Eine Zeichenfolge, die den Ereignistyp identifiziert.
  + `"resources"`: Ein JSON-Array von Zeichenketten, das die an dem Ereignis beteiligten Ressourcen identifiziert. Dieses Feld kann ein leeres Array sein.
  + `"time"`: Der als Zeichenfolge bereitgestellte Zeitstempel des Ereignisses. Dies sollte dem [RFC3339](https://www.rfc-editor.org/rfc/rfc3339.txt)Zeitstempelformat entsprechen.

Die folgenden Ausschnitte sind einige Beispiele für gültige Objekte: `Event`

**Beispiel 1**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : [1,2,3,4],
        "key2" : "strval"
    },
    "detailType" : "sampleDetailType",
    "resources" : ["Resouce1", "Resource2"],
    "time" : "2022-01-10T05:00:10Z"
}
```

**Beispiel 2**

```
{
    "source" : "source1",
    "detail" : {},
    "detailType" : "sampleDetailType"
}
```

**Beispiel 3**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : 1200
    },
    "detailType" : "sampleDetailType",
    "resources" : []
}
```

# AWS AppSync JavaScript Resolver-Funktionsreferenz für die `None` Datenquelle
<a name="resolver-reference-none-js"></a>

Die AWS AppSync Resolverfunktion Request and Response mit der Datenquelle vom Typ *None* ermöglicht es Ihnen, Anfragen für AWS AppSync lokale Operationen zu gestalten.

## Anforderung
<a name="request-js"></a>

Der Request-Handler kann einfach sein und ermöglicht es Ihnen, so viele Kontextinformationen wie möglich über das Feld zu übergeben. `payload`

```
type NONERequest = {
  payload: any;
};
```

Hier ist ein Beispiel, bei dem die Feldargumente an die Nutzlast übergeben werden:

```
export function request(ctx) {
  return {
    payload: context.args
  };
}
```

Der Wert des `payload` Feldes wird an den Response-Handler der Funktion weitergeleitet und ist in `context.result` verfügbar.

## Nutzlast
<a name="payload-js"></a>

Das `payload` Feld ist ein Container, der verwendet werden kann, um alle Daten zu übergeben, die dann dem Antworthandler der Funktion zur Verfügung gestellt werden.

 Das Feld `payload` ist optional.

## Antwort
<a name="response-js"></a>

Da es keine Datenquelle gibt, wird der Wert des `payload` Felds an den Antworthandler der Funktion weitergeleitet und für die `context.result` Eigenschaft festgelegt.

Wenn die Form des `payload` Feldwerts genau der Form des GraphQL-Typs entspricht, können Sie die Antwort mit dem folgenden Antworthandler weiterleiten:

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

Für die Rückantwort gelten keine erforderlichen Felder oder Formbeschränkungen. Da GraphQL jedoch stark typisiert ist, muss die aufgelöste Antwort dem erwarteten GraphQL-Typ entsprechen.

# AWS AppSync JavaScript Resolver-Funktionsreferenz für HTTP
<a name="resolver-reference-http-js"></a>

Die AWS AppSync HTTP-Resolver-Funktionen ermöglichen es Ihnen, Anfragen von einem beliebigen HTTP-Endpunkt und Antworten von Ihrem HTTP-Endpunkt zurück AWS AppSync zu senden. AWS AppSync Mit Ihrem Request-Handler können Sie AWS AppSync Hinweise zur Art des aufzurufenden Vorgangs geben. In diesem Abschnitt werden die verschiedenen Konfigurationen für den unterstützten HTTP-Resolver beschrieben.

## Anforderung
<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;
};
```

Der folgende Ausschnitt ist ein Beispiel für eine HTTP-POST-Anfrage mit einem Hauptteil: `text/plain`

```
export function request(ctx) {
  return {
    method: 'POST',
    params: {
      headers: { 'Content-Type': 'text/plain' },
      body: 'this is an example of text body',
    },
    resourcePath: '/',
  };
}
```

## Methode
<a name="method-js"></a>

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

HTTP-Methode oder Verb (GET, POST, PUT, PATCH oder DELETE), das AWS AppSync an den HTTP-Endpunkt sendet.

```
"method": "PUT"
```

## ResourcePath
<a name="resourcepath-js"></a>

 

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

Der Ressourcenpfad, auf den Sie zugreifen möchten. Zusammen mit dem Endpunkt in der HTTP-Datenquelle bildet der Ressourcenpfad die URL, an die der AWS AppSync Dienst eine Anfrage stellt.

```
"resourcePath": "/v1/users"
```

Wenn die Anfrage ausgewertet wird, wird dieser Pfad als Teil der HTTP-Anfrage gesendet, einschließlich des HTTP-Endpunkts. Das vorherige Beispiel kann dann beispielsweise so aussehen:

```
PUT <endpoint>/v1/users
```

## Params-Felder
<a name="params-field-js"></a>

**Anmerkung**  
Dies gilt nur für den Request-Handler. 

Wird verwendet, um anzugeben, welche Aktion die Suche durchführt, meistens indem der **Abfragewert** im **Body** festgelegt wird. Es gibt jedoch einige andere Funktionen, die konfiguriert werden können, wie z. B. die Formatierung von Antworten.

** **Header** **  
Die Header-Informationen, wie beispielsweise Schlüssel-Wert-Paare. Der Schlüssel und der Wert müssen beide Strings sein.  
Beispiel:  

```
"headers" : {
    "Content-Type" : "application/json"
}
```
Derzeit werden folgende `Content-Type`-Header unterstützt:  

```
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
```
Sie können die folgenden HTTP-Header nicht festlegen:  

```
HOST
CONNECTION
USER-AGENT
EXPECTATION
TRANSFER_ENCODING
CONTENT_LENGTH
```

** **query** **  
Schlüssel-Wert-Paare, die allgemeine Optionen angeben, z. B. Codeformatierung für JSON-Antworten. Der Schlüssel und der Wert müssen beide Strings sein. Das folgende Beispiel zeigt, wie Sie eine Abfragezeichenfolge als `?type=json` senden können:  

```
"query" : {
    "type" : "json"
}
```

** **body** **  
Der Rumpf enthält den HTTP-Anforderungstext, den Sie festgelegen. Der Anforderungstext ist immer eine UTF-8-codierte Zeichenfolge, es sei denn, der Inhaltstyp gibt den Zeichensatz an.  

```
"body":"body string"
```

## Antwort
<a name="response-js"></a>

Sehen Sie ein Beispiel [hier](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-http-resolvers-js.html).

# AWS AppSync JavaScript Resolver-Funktionsreferenz für Amazon RDS
<a name="resolver-reference-rds-js"></a>

Die AWS AppSync RDS-Funktion und der RDS-Resolver ermöglichen es Entwicklern, mithilfe der RDS-Daten-API SQL Abfragen an eine Amazon Aurora Aurora-Cluster-Datenbank zu senden und das Ergebnis dieser Abfragen zurückzuerhalten. Sie können SQL Anweisungen schreiben, die an die `sql` Daten-API gesendet werden, indem AWS AppSync Sie die mit dem `rds` Modul markierte Vorlage oder die Hilfsfunktionen`select`, `insert``update`, und `remove` Hilfsfunktionen des `rds` Moduls verwenden. AWS AppSync verwendet die [https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html)Aktion des RDS-Datendienstes, um SQL-Anweisungen für die Datenbank auszuführen. 

**Topics**
+ [Mit SQL markierte Vorlage](#sql-tagged-templates)
+ [Aussagen erstellen](#creating-statements)
+ [Abrufen von Daten](#retrieving-data)
+ [Hilfsfunktionen](#utility-functions)
+ [SQL auswählen](#utility-functions-select)
+ [SQL einfügen](#utility-functions-insert)
+ [SQL-Aktualisierung](#utility-functions-update)
+ [SQL Löschen](#utility-functions-delete)
+ [Umwandlung](#casting)

## Mit SQL markierte Vorlage
<a name="sql-tagged-templates"></a>

AWS AppSync Die `sql` mit Tags versehene Vorlage ermöglicht es Ihnen, mithilfe von Vorlagenausdrücken eine statische Anweisung zu erstellen, die zur Laufzeit dynamische Werte empfangen kann. AWS AppSync erstellt eine Variablenzuordnung aus den Ausdruckswerten, um eine [https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html)Abfrage zu erstellen, die an die Amazon Aurora Serverless Data API gesendet wird. Mit dieser Methode ist es nicht möglich, dass dynamische Werte, die zur Laufzeit übergeben werden, die ursprüngliche Anweisung ändern, was zu einer unbeabsichtigten Ausführung führen könnte. Alle dynamischen Werte werden als Parameter übergeben, können die ursprüngliche Anweisung nicht ändern und werden nicht von der Datenbank ausgeführt. Dadurch ist Ihre Abfrage weniger anfällig für SQL Injektionsangriffe.

**Anmerkung**  
In jedem Fall sollten Sie beim Schreiben von SQL Aussagen die Sicherheitsrichtlinien befolgen, um die Daten, die Sie als Eingabe erhalten, ordnungsgemäß zu behandeln.

**Anmerkung**  
Die `sql` mit Tags versehene Vorlage unterstützt nur die Übergabe von Variablenwerten. Sie können keinen Ausdruck verwenden, um die Spalten- oder Tabellennamen dynamisch anzugeben. Sie können jedoch Hilfsfunktionen verwenden, um dynamische Anweisungen zu erstellen.

Im folgenden Beispiel erstellen wir eine Abfrage, die basierend auf dem Wert des `col` Arguments filtert, das zur Laufzeit dynamisch in der GraphQL-Abfrage festgelegt wird. Der Wert kann der Anweisung nur mithilfe des Tag-Ausdrucks hinzugefügt werden:

```
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);
}
```

Indem wir alle dynamischen Werte über die Variablenzuordnung übergeben, verlassen wir uns darauf, dass die Datenbank-Engine Werte sicher verarbeitet und bereinigt.

## Aussagen erstellen
<a name="creating-statements"></a>

Funktionen und Resolver können mit MySQL- und PostgreSQL-Datenbanken interagieren. Verwenden Sie `createPgStatement` jeweils `createMySQLStatement` und, um Anweisungen zu erstellen. `createMySQLStatement`Kann beispielsweise eine MySQL-Abfrage erstellen. Diese Funktionen akzeptieren bis zu zwei Anweisungen. Dies ist nützlich, wenn eine Anfrage sofort Ergebnisse abrufen soll. Mit MySQL könnten Sie Folgendes tun:

```
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);
}
```

**Anmerkung**  
`createPgStatement`und `createMySQLStatement` maskiert oder zitiert keine Aussagen, die mit der `sql` markierten Vorlage erstellt wurden.

## Abrufen von Daten
<a name="retrieving-data"></a>

Das Ergebnis Ihrer ausgeführten SQL-Anweisung ist in Ihrem Antworthandler im `context.result` Objekt verfügbar. Das Ergebnis ist eine JSON-Zeichenfolge mit den [Antwortelementen](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html#API_ExecuteStatement_ResponseElements) aus der `ExecuteStatement` Aktion. Bei der Analyse hat das Ergebnis die folgende Form:

```
type SQLStatementResults = {
    sqlStatementResults: {
        records: any[];
        columnMetadata: any[];
        numberOfRecordsUpdated: number;
        generatedFields?: any[]
    }[]
}
```

Sie können das `toJsonObject` Hilfsprogramm verwenden, um das Ergebnis in eine Liste von JSON-Objekten umzuwandeln, die die zurückgegebenen Zeilen darstellen. Beispiel:

```
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]
}
```

Beachten Sie, dass ein `toJsonObject` Array von Anweisungsergebnissen zurückgegeben wird. Wenn Sie eine Anweisung angegeben haben, ist die Länge des Arrays`1`. Wenn Sie zwei Anweisungen angegeben haben, ist die Array-Länge`2`. Jedes Ergebnis im Array enthält `0` oder mehr Zeilen. `toJsonObject`gibt zurück`null`, wenn der Ergebniswert ungültig oder unerwartet ist.

## Hilfsfunktionen
<a name="utility-functions"></a>

Sie können die Hilfsprogramme des AWS AppSync RDS-Moduls verwenden, um mit Ihrer Datenbank zu interagieren.

### SQL auswählen
<a name="utility-functions-select"></a>

Das `select` Hilfsprogramm erstellt eine `SELECT` Anweisung zur Abfrage Ihrer relationalen Datenbank. 

**Grundlegende Verwendung**

In ihrer Grundform können Sie die Tabelle angeben, die Sie abfragen möchten:

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

export function request(ctx) {

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

Beachten Sie, dass Sie das Schema auch in Ihrem Tabellen-Identifier angeben können:

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

export function request(ctx) {

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

**Spalten angeben**

Sie können Spalten mit der `columns` Eigenschaft angeben. Wenn dies nicht auf einen Wert gesetzt ist, ist es standardmäßig: `*`

```
export function request(ctx) {

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

Sie können auch die Tabelle einer Spalte angeben:

```
export function request(ctx) {

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

**Grenzwerte und Offsets**

Sie können `limit` und auf `offset` die Abfrage anwenden:

```
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
    }));
}
```

**Sortiert nach**

Sie können Ihre Ergebnisse nach der `orderBy` Eigenschaft sortieren. Geben Sie eine Reihe von Objekten an, die die Spalte und eine optionale `dir` Eigenschaft angeben:

```
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**

Sie können Filter erstellen, indem Sie das Objekt mit der speziellen Bedingung verwenden:

```
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'}}
    }));
}
```

Sie können Filter auch kombinieren:

```
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}}
    }));
}
```

Sie können auch `OR` Aussagen erstellen:

```
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 } }
        ]}
    }));
}
```

Sie können eine Bedingung auch negieren mit`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 } }
        ]}
    }));
}
```

Sie können auch die folgenden Operatoren verwenden, um Werte zu vergleichen:


| 
| 
| Operator | Description | Mögliche Wertetypen | 
| --- |--- |--- |
| eq | Gleich | Zahl, Zeichenfolge, boolescher Wert | 
| Eins | Ungleich | Zahl, Zeichenfolge, boolescher Wert | 
| le | Kleiner als oder gleich | Zahl, Zeichenfolge | 
| lt | Kleiner als | Zahl, Zeichenfolge | 
| ge | Größer als oder gleich | Zahl, Zeichenfolge | 
| gt | Größer als | Zahl, Zeichenfolge | 
| enthält | Wie | Zeichenfolge | 
| Nicht enthält | Nicht wie | Zeichenfolge | 
| Beginnt mit | Beginnt mit einem Präfix | Zeichenfolge | 
| zwischen | Zwischen zwei Werten | Zahl, Zeichenfolge | 
| Das Attribut ist vorhanden | Das Attribut ist nicht Null | Zahl, Zeichenfolge, boolescher Wert | 
| size | prüft die Länge des Elements | Zeichenfolge | 

### SQL einfügen
<a name="utility-functions-insert"></a>

Das `insert` Hilfsprogramm bietet eine einfache Möglichkeit, mit dem `INSERT` Vorgang einzeilige Elemente in Ihre Datenbank einzufügen.

**Einfügungen einzelner Elemente**

Um ein Element einzufügen, geben Sie die Tabelle an und übergeben Sie dann Ihr Werteobjekt. Die Objektschlüssel sind Ihren Tabellenspalten zugeordnet. Spaltennamen werden automatisch maskiert, und Werte werden mithilfe der Variablenzuordnung an die Datenbank gesendet:

```
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)
}
```

**MySQL-Anwendungsfall**

Sie können ein `insert` gefolgt von einem kombinieren`select`, um Ihre eingefügte Zeile abzurufen:

```
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)
}
```

**Anwendungsfall Postgres**

Mit Postgres können Sie Daten aus der Zeile abrufen [https://www.postgresql.org/docs/current/dml-returning.html](https://www.postgresql.org/docs/current/dml-returning.html), die Sie eingefügt haben. Es akzeptiert `*` oder ein Array von Spaltennamen:

```
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)
}
```

### SQL-Aktualisierung
<a name="utility-functions-update"></a>

Das `update` Hilfsprogramm ermöglicht es Ihnen, bestehende Zeilen zu aktualisieren. Sie können das Bedingungsobjekt verwenden, um Änderungen an den angegebenen Spalten in allen Zeilen vorzunehmen, die die Bedingung erfüllen. Nehmen wir zum Beispiel an, wir haben ein Schema, das es uns ermöglicht, diese Mutation vorzunehmen. Wir wollen das `name` von `Person` mit dem `id` Wert von aktualisieren, `3` aber nur, wenn wir sie (`known_since`) seit dem Jahr kennen`2000`:

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

Unser Update Resolver sieht so aus:

```
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)
}
```

Wir können unserer Bedingung ein Häkchen hinzufügen, um sicherzustellen, dass nur die Zeile aktualisiert `3` wird, deren Primärschlüssel `id` gleich ist. In ähnlicher Weise können Sie Postgres verwenden`inserts`, `returning` um die geänderten Daten zurückzugeben. 

### SQL Löschen
<a name="utility-functions-delete"></a>

Das `remove` Hilfsprogramm ermöglicht es Ihnen, bestehende Zeilen zu löschen. Sie können das Bedingungsobjekt für alle Zeilen verwenden, die die Bedingung erfüllen. Beachten Sie, dass `delete` es sich um ein reserviertes Schlüsselwort in handelt JavaScript. `remove`sollte stattdessen verwendet werden:

```
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)
}
```

## Umwandlung
<a name="casting"></a>

In einigen Fällen benötigen Sie möglicherweise genauere Angaben zum richtigen Objekttyp, den Sie in Ihrer Anweisung verwenden möchten. Sie können die bereitgestellten Typhinweise verwenden, um den Typ Ihrer Parameter anzugeben. AWS AppSync unterstützt [dieselben Typhinweise](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html#rdsdtataservice-Type-SqlParameter-typeHint) wie die Daten-API. Sie können Ihre Parameter mithilfe der `typeHint` Funktionen des AWS AppSync `rds` Moduls umwandeln. 

Das folgende Beispiel ermöglicht es Ihnen, ein Array als Wert zu senden, der als JSON-Objekt umgewandelt wird. Wir verwenden den `->` Operator, um das Element `index` `2` im JSON-Array abzurufen:

```
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 ist auch nützlich bei der Handhabung und beim Vergleichen von `DATE``TIME`, und`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)
}
```

Hier ist ein weiteres Beispiel, das zeigt, wie Sie das aktuelle Datum und die aktuelle Uhrzeit senden können:

```
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)}`)
}
```

**Verfügbare Typhinweise**
+ `typeHint.DATE`- Der entsprechende Parameter wird als Objekt des `DATE` Typs an die Datenbank gesendet. Das akzeptierte Format ist `YYYY-MM-DD`.
+ `typeHint.DECIMAL`- Der entsprechende Parameter wird als Objekt des `DECIMAL` Typs an die Datenbank gesendet.
+ `typeHint.JSON`- Der entsprechende Parameter wird als Objekt des `JSON` Typs an die Datenbank gesendet.
+ `typeHint.TIME`- Der entsprechende Zeichenkettenparameterwert wird als Objekt des `TIME` Typs an die Datenbank gesendet. Das akzeptierte Format ist `HH:MM:SS[.FFF]`. 
+ `typeHint.TIMESTAMP`- Der entsprechende Zeichenkettenparameterwert wird als Objekt des `TIMESTAMP` Typs an die Datenbank gesendet. Das akzeptierte Format ist `YYYY-MM-DD HH:MM:SS[.FFF]`.
+ `typeHint.UUID`- Der entsprechende Zeichenkettenparameterwert wird als Objekt des `UUID` Typs an die Datenbank gesendet.

# AWS AppSync JavaScript Resolver und Funktionsreferenz für Amazon Bedrock Runtime
<a name="resolver-reference-bedrock-js"></a>

Sie können AWS AppSync Funktionen und Resolver verwenden, um Modelle auf Amazon Bedrock in Ihrem aufzurufen. AWS-Konto Sie können Ihre Anforderungs-Payloads und die Antwort Ihrer Modellaufruf-Funktionen gestalten, bevor Sie sie an Ihre Kunden zurücksenden. Sie können die `InvokeModel` API oder die API der Amazon Bedrock Runtime verwenden. `Converse` In diesem Abschnitt werden die Anfragen für die unterstützten Amazon Bedrock-Operationen beschrieben.

**Anmerkung**  
AWS AppSync unterstützt nur synchrone Aufrufe, die innerhalb von 10 Sekunden abgeschlossen werden. Es ist nicht möglich, den Stream APIs von Amazon Bedrock aufzurufen. AWS AppSync unterstützt nur das Aufrufen von Foundation-Modellen und [Inferenzprofilen](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles.html) in derselben Region wie die API. AWS AppSync 

## Objekt anfordern
<a name="request_object"></a>

Das `InvokeModel` Anforderungsobjekt ermöglicht Ihnen die Interaktion mit der `InvokeModel` API von Amazon Bedrock.

```
type BedrockInvokeModelRequest = {
  operation: 'InvokeModel';
  modelId: string;
  body: any;
  guardrailIdentifier?: string;
  guardrailVersion?: string;
  guardrailTrace?: string;
}
```

Das `Converse` Anforderungsobjekt ermöglicht Ihnen die Interaktion mit der `Converse` API von 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;
}
```

Weitere Informationen finden Sie im [Geben Sie eine Referenz ein](#type-reference-bedrock) Abschnitt weiter unten in diesem Thema.

Aus Ihren Funktionen und Resolvern heraus können Sie Ihre Anforderungsobjekte direkt erstellen oder die Hilfsfunktionen von @aws verwendenappsync/utils/ai, um die Anfrage zu erstellen. Wenn Sie die modelId (ModelID) in Ihren Anfragen angeben, können Sie die Modell-ID oder den Modell-ARN verwenden.

Im folgenden Beispiel wird die `invokeModel` Funktion verwendet, um Text mithilfe von Amazon Titan Text G1 - Lite (amazon) zusammenzufassen. titan-text-lite-v1). Eine konfigurierte Leitplanke wird verwendet, um unerwünschte Inhalte im Prompt-Flow zu identifizieren und zu blockieren oder zu filtern. Weitere Informationen zu [Amazon Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) finden Sie im *Amazon Bedrock-Benutzerhandbuch*.

**Wichtig**  
Sie sind verantwortlich für die sichere Anwendungsentwicklung und die Vermeidung von Sicherheitslücken, wie z. B. Prompt Injection. Weitere Informationen finden Sie unter [Prompt Injection Security](https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-injection.html) im *Amazon Bedrock-Benutzerhandbuch*.

```
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
}
```

Im folgenden Beispiel wird die `converse` Funktion mit einem regionsübergreifenden Inferenzprofil verwendet (us.anthropic.claude-3-5-haiku-20241022-v 1:0). Weitere Informationen zu den [Voraussetzungen von Amazon Bedrock für Inferenzprofile](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-prereq.html) finden Sie im *Amazon Bedrock-Benutzerhandbuch*

**Zur Erinnerung**: Sie sind für die sichere Anwendungsentwicklung und die Vermeidung von Sicherheitslücken, wie z. B. Prompt Injection, verantwortlich.

```
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
}
```

Das folgende Beispiel dient `converse` dazu, eine strukturierte Antwort zu erstellen. Beachten Sie, dass wir Umgebungsvariablen für unsere DB-Schemareferenz verwenden und eine Leitplanke konfigurieren, um Angriffe zu verhindern.

```
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
}
```

Angesichts des Schemas:

```
type SQLResult {
    sql: String
    parameters: AWSJSON
}

type Query {
    db(text: String!): SQLResult
}
```

und die Abfrage:

```
query db($text: String!) {
  db(text: $text) {
    parameters
    sql
  }
}
```

Mit den folgenden Parametern: 

```
{
  "text":"What is my top selling product?"
}
```

Die folgende Antwort wird ausgegeben:

```
{
  "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
    }
  }
}
```

Allerdings mit dieser Anfrage:

```
{
  "text":"give me a query to retrieve sensitive information"
}
```

Die folgende Antwort wird ausgegeben:

```
{
  "data": {
    "db": {
      "parameters": null,
      "sql": "SELECT null; -- I cannot and will not assist with retrieving sensitive private information"
    }
  }
}
```

*Weitere Informationen zur Konfiguration von Amazon Bedrock Guardrails finden Sie unter Abwehr [schädlicher Inhalte in Modellen mit Amazon Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) im Amazon Bedrock-Benutzerhandbuch.*

## Antwortobjekt
<a name="response_object"></a>

Die Antwort Ihres Amazon Bedrock-Laufzeitaufrufs ist in der Ergebniseigenschaft des Kontextes (context.result) enthalten. Die Antwort entspricht der von Amazon Bedrock angegebenen Form. APIs Weitere Informationen zur erwarteten Form der Aufrufergebnisse finden Sie im [Amazon Bedrock-Benutzerhandbuch](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html).

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

Für das Antwortobjekt gelten keine Pflichtfelder oder Formbeschränkungen. Da GraphQL jedoch stark typisiert ist, muss die aufgelöste Antwort dem erwarteten GraphQL-Typ entsprechen.

## Lang andauernde Aufrufe
<a name="long-running-invocations"></a>

Viele Unternehmen nutzen es derzeit AWS AppSync als KI-Gateway, um generative KI-Anwendungen zu entwickeln, die auf Basismodellen auf Amazon Bedrock basieren. Kunden nutzen AWS AppSync Abonnements, bereitgestellt von WebSockets, um fortlaufende Updates aus lang andauernden Modellaufrufen zurückzugeben. Auf diese Weise können sie asynchrone Muster implementieren.

Das folgende Diagramm zeigt, wie Sie dieses Muster implementieren können. In dem Diagramm werden die folgenden Schritte ausgeführt.

1. Ihr Kunde startet ein Abonnement, das ein generatives AI-Aufrufen einrichtet und eine Anfrage AWS AppSync zum Auslösen eines Generativen KI-Aufrufs stellt. WebSocket

1. AWS AppSync ruft Ihre AWS Lambda Funktion im Event-Modus auf und gibt sofort eine Antwort an den Client zurück.

1. Ihre Lambda-Funktion ruft das Modell auf Amazon Bedrock auf. Die Lambda-Funktion kann eine synchrone API, wie`InvokeModel`, oder eine Stream-API, wie, verwenden, um progressive `InvokeModelWithResponseStream` Updates zu erhalten.

1. Wenn Updates empfangen werden oder wenn der Aufruf abgeschlossen ist, sendet die Lambda-Funktion Updates über Mutationen an Ihre AWS AppSync API, wodurch Abonnements ausgelöst werden.

1. Die Abonnement-Ereignisse werden in Echtzeit gesendet und von Ihrem Kunden über den empfangen. WebSocket

![\[Ein Diagramm, das den Arbeitsablauf für die Verwendung eines AWS AppSync Abonnements zur Rückgabe von Updates aus einem Amazon Bedrock-Modell veranschaulicht.\]](http://docs.aws.amazon.com/de_de/appsync/latest/devguide/images/bedrock-workflow.png)


## Geben Sie eine Referenz ein
<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;
};
```