

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# AWS AppSync référence du résolveur () JavaScript
<a name="resolver-reference-js-version"></a>

Les sections suivantes contiennent les références relatives à l'`APPSYNC_JS`exécution et au JavaScript résolveur :
+  [ JavaScriptprésentation des résolveurs](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html) - En savoir plus sur le fonctionnement des résolveurs dans. AWS AppSync
+  [Référence de l'objet de contexte du résolveur](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) : en savoir plus sur l'objet de contexte et son utilisation dans les résolveurs.
+  [ JavaScript fonctionnalités d'exécution pour les résolveurs et les fonctions](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) - En savoir plus sur les fonctionnalités d'exécution prises en charge et sur l'utilisation d'utilitaires pour simplifier le code.
+  [ JavaScriptréférence des fonctions de résolution pour DynamoDB](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html) - En savoir plus sur la façon dont les résolveurs interagissent avec DynamoDB.
+  [ JavaScriptréférence de la fonction de résolution pour OpenSearch ](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-elasticsearch-js.html) - En savoir plus sur la structure de demande et de réponse du résolveur et sur les interactions avec OpenSearch le service.
+  [ JavaScript référence de la fonction de résolution pour Lambda](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-lambda-js.html) - En savoir plus sur la structure de demande et de réponse du résolveur et sur les interactions avec Lambda.
+  [ JavaScriptréférence de la fonction de résolution pour la source de EventBridge données](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-eventbridge-js.html) - En savoir plus sur la structure des demandes et réponses du résolveur et sur les interactions avec. EventBridge
+  [ JavaScript référence de la fonction de résolution pour la source de données None](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-none-js.html) - En savoir plus sur la structure de demande et de réponse du résolveur et les interactions avec les sources de données NONE.
+  [ JavaScript référence de la fonction de résolution pour HTTP](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-http-js.html) - En savoir plus sur la structure des demandes et réponses du résolveur et sur les interactions avec les points de terminaison HTTP.
+  [ JavaScript référence de la fonction de résolution pour Amazon RDS](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-rds-js.html) - En savoir plus sur la structure du résolveur et les interactions avec RDS.
+  [ JavaScript référence de la fonction de résolution pour Amazon Bedrock](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-bedrock-js.html) - En savoir plus sur la structure du résolveur et les interactions avec Amazon Bedrock.

# AWS AppSync JavaScript vue d'ensemble des résolveurs
<a name="resolver-reference-overview-js"></a>

AWS AppSync vous permet de répondre aux requêtes GraphQL en effectuant des opérations sur vos sources de données. Pour chaque champ GraphQL sur lequel vous souhaitez exécuter une requête, une mutation ou un abonnement, un résolveur doit être joint.

Les résolveurs sont les connecteurs entre GraphQL et une source de données. Ils expliquent AWS AppSync comment traduire une requête GraphQL entrante en instructions pour votre source de données principale et comment traduire la réponse de cette source de données en réponse GraphQL. Avec AWS AppSync, vous pouvez écrire vos résolveurs en les utilisant JavaScript et les exécuter dans l'environnement AWS AppSync (`APPSYNC_JS`). 

AWS AppSync vous permet d'écrire des résolveurs d'unités ou des résolveurs de pipeline composés de plusieurs AWS AppSync fonctions dans un pipeline.

## Fonctionnalités d'exécution prises en charge
<a name="runtime-support-js"></a>

Le AWS AppSync JavaScript moteur d'exécution fournit un sous-ensemble de JavaScript bibliothèques, d'utilitaires et de fonctionnalités. Pour une liste complète des fonctionnalités prises en charge par le `APPSYNC_JS` moteur d'exécution, voir [Fonctionnalités JavaScript d'exécution pour les résolveurs et les fonctions](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html).

## Résolveurs d'unités
<a name="unit-resolver-js"></a>

Un résolveur d'unités est composé d'un code qui définit un gestionnaire de demandes et de réponses qui sont exécutés sur une source de données. Le gestionnaire de demandes prend un objet de contexte comme argument et renvoie la charge utile de la demande utilisée pour appeler votre source de données. Le gestionnaire de réponses reçoit une charge utile en retour de la source de données avec le résultat de la demande exécutée. Le gestionnaire de réponse transforme la charge utile en réponse GraphQL pour résoudre le champ GraphQL. Dans l'exemple ci-dessous, un résolveur extrait un élément d'une source de données DynamoDB :

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

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

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

## Anatomie d'un résolveur de JavaScript pipeline
<a name="anatomy-of-a-pipeline-resolver-js"></a>

Un résolveur de pipeline est composé d'un code qui définit un gestionnaire de requêtes et de réponses et d'une liste de fonctions. Chaque fonction possède un gestionnaire de **requêtes** et de **réponses** qu'elle exécute sur une source de données. Lorsqu'un résolveur de pipeline délègue des exécutions à une liste de fonctions, il n'est donc lié à aucune source de données. Les résolveurs d'unité et les fonctions sont des primitifs qui exécutent l'opération sur les sources de données.

### Gestionnaire de requêtes Pipeline Resolver
<a name="request-handler-js"></a>

Le gestionnaire de requêtes d'un résolveur de pipeline (étape précédente) vous permet d'exécuter une certaine logique de préparation avant d'exécuter les fonctions définies.

### Liste des fonctions
<a name="functions-list-js"></a>

La liste des fonctions d'un résolveur de pipeline est exécutée dans l'ordre. Le résultat de l'évaluation du gestionnaire de demandes du résolveur de pipeline est mis à la disposition de la première fonction sous forme de. `ctx.prev.result` Le résultat de l'évaluation de chaque fonction est disponible pour la fonction suivante sous forme de`ctx.prev.result`.

### Gestionnaire de réponses Pipeline Resolver
<a name="response-handler-js"></a>

Le gestionnaire de réponse d'un résolveur de pipeline vous permet d'exécuter une certaine logique finale entre la sortie de la dernière fonction et le type de champ GraphQL attendu. La sortie de la dernière fonction de la liste des fonctions est disponible dans le gestionnaire de réponse du résolveur de pipeline sous `ctx.prev.result` la forme ou. `ctx.result`

### Flux d'exécution
<a name="execution-flow-js"></a>

Étant donné qu'un résolveur de pipeline comprend deux fonctions, la liste ci-dessous représente le flux d'exécution lorsque le résolveur est invoqué :

1.  Gestionnaire de requêtes Pipeline Resolver

1.  Fonction 1 : gestionnaire de demandes de fonctions 

1.  Fonction 1 : Appel de source de données 

1.  Fonction 1 : gestionnaire de réponse fonctionnelle 

1.  Fonction 2 : gestionnaire de demandes de fonctions 

1.  Fonction 2 : Appel de source de données 

1.  Fonction 2 : gestionnaire de réponse fonctionnelle 

1.  Gestionnaire de réponses Pipeline Resolver 

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


### Utilitaires intégrés utiles à l'`APPSYNC_JS`exécution
<a name="useful-utilities-js"></a>

Les utilitaires suivants peuvent vous aider si vous travaillez avec des résolveurs de pipeline.

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

Le stash est un objet mis à disposition dans chaque résolveur et chaque gestionnaire de demandes et de réponses de fonctions. La même instance de stash passe par une seule exécution du résolveur. Cela signifie que vous pouvez utiliser le stash pour transmettre des données arbitraires entre les gestionnaires de requêtes et de réponses et entre les fonctions d'un résolveur de pipeline. Vous pouvez tester la réserve comme un JavaScript objet normal.

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

`ctx.prev.result` représente le résultat de l'opération précédente exécutée dans le pipeline. Si l'opération précédente était le gestionnaire de demandes du résolveur de pipeline, elle `ctx.prev.result` est alors mise à la disposition de la première fonction de la chaîne. Si l'opération précédente est la première fonction, alors `ctx.prev.result` représente le résultat de la première fonction et il est disponible pour la seconde fonction du pipeline. Si l'opération précédente était la dernière fonction, elle `ctx.prev.result` représente la sortie de la dernière fonction et est mise à la disposition du gestionnaire de réponse du résolveur de pipeline.

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

L'utilitaire `util.error` est utile pour envoyer une erreur de champ. `util.error`L'utilisation à l'intérieur d'un gestionnaire de demandes ou de réponses de fonction génère immédiatement une erreur de champ, ce qui empêche l'exécution des fonctions suivantes. Pour plus de détails et pour d'autres `util.error` signatures, consultez les [fonctionnalités JavaScript d'exécution pour les résolveurs et les fonctions](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html).

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

`util.appendError`est similaire à`util.error()`, avec la principale différence qu'il n'interrompt pas l'évaluation du gestionnaire. Il signale plutôt qu'une erreur s'est produite dans le champ, mais permet d'évaluer le gestionnaire et, par conséquent, de renvoyer des données. L'utilisation de `util.appendError` dans une fonction ne perturbera pas le flux d'exécution du pipeline. Pour plus de détails et pour d'autres `util.error` signatures, consultez les [fonctionnalités JavaScript d'exécution relatives aux résolveurs et aux fonctions](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html).

#### Temps d'exécution. Retour anticipé
<a name="runtime-earlyreturn-js"></a>

La `runtime.earlyReturn` fonction vous permet de revenir prématurément à n'importe quelle fonction de requête. L'utilisation de `runtime.earlyReturn` l'intérieur d'un gestionnaire de demandes de résolution sera renvoyée par le résolveur. L'appeler depuis un gestionnaire de demandes de AWS AppSync fonction retournera depuis la fonction et poursuivra l'exécution vers la fonction suivante du pipeline ou vers le gestionnaire de réponse du résolveur.

### Écrire des résolveurs de pipeline
<a name="writing-resolvers"></a>

Un résolveur de pipeline possède également un gestionnaire de requêtes et de réponses entourant l'exécution des fonctions du pipeline : son gestionnaire de demandes est exécuté avant la demande de la première fonction, et son gestionnaire de réponse est exécuté après la réponse de la dernière fonction. Le gestionnaire de requêtes Resolver peut configurer les données à utiliser par les fonctions du pipeline. Le gestionnaire de réponse du résolveur est chargé de renvoyer les données correspondant au type de sortie du champ GraphQL. Dans l'exemple ci-dessous, un gestionnaire de demandes de résolution définit `allowedGroups` ; les données renvoyées doivent appartenir à l'un de ces groupes. Cette valeur peut être utilisée par les fonctions du résolveur pour demander des données. Le gestionnaire de réponses du résolveur effectue une dernière vérification et filtre le résultat pour s'assurer que seuls les éléments appartenant aux groupes autorisés sont renvoyés.

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

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

#### AWS AppSync Fonctions d'écriture
<a name="writing-functions"></a>

AWS AppSync les fonctions vous permettent d'écrire une logique commune que vous pouvez réutiliser dans plusieurs résolveurs de votre schéma. Par exemple, vous pouvez avoir une AWS AppSync fonction appelée `QUERY_ITEMS` qui est chargée de demander des éléments à partir d'une source de données Amazon DynamoDB. Pour les résolveurs avec lesquels vous souhaitez interroger des éléments, ajoutez simplement la fonction au pipeline du résolveur et fournissez l'index de requête à utiliser. La logique n'a pas besoin d'être réimplémentée.

## Sujets supplémentaires
<a name="supplemental-topics"></a>

**Rubriques**
+ [Exemple de résolveur de pipeline avec Amazon DynamoDB](https://docs.aws.amazon.com/appsync/latest/devguide/writing-code.html)
+ [Configuration des utilitaires pour l'`APPSYNC_JS`environnement d'exécution](https://docs.aws.amazon.com/appsync/latest/devguide/utility-resolvers.html)
+ [Regroupement et sources TypeScript de cartes pour l'environnement d'exécution `APPSYNC_JS`](https://docs.aws.amazon.com/appsync/latest/devguide/additional-utilities.html)
+ [Tester votre résolveur et vos gestionnaires de fonctions](https://docs.aws.amazon.com/appsync/latest/devguide/test-resolvers.html)
+ [Migration de VTL vers JavaScript](https://docs.aws.amazon.com/appsync/latest/devguide/migrating-resolvers.html)
+ [Choisir entre un accès direct à une source de données ou un proxy via une source de données Lambda](https://docs.aws.amazon.com/appsync/latest/devguide/choosing-data-source.html)

# Exemple de résolveur de pipeline avec Amazon DynamoDB
<a name="writing-code"></a>

Supposons que vous souhaitiez associer un résolveur de pipeline à un champ nommé `getPost(id:ID!)` qui renvoie un `Post` type provenant d'une source de données Amazon DynamoDB avec la requête GraphQL suivante :

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

Tout d'abord, attachez un résolveur simple à l'`Query.getPost`aide du code ci-dessous. Il s'agit d'un exemple de code de résolution simple. Aucune logique n'est définie dans le gestionnaire de demandes, et le gestionnaire de réponse renvoie simplement le résultat de la dernière fonction.

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

Définissez ensuite la fonction `GET_ITEM` qui extrait un article de votre source de données :

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

En cas d'erreur lors de la requête, le gestionnaire de réponse de la fonction ajoute une erreur qui sera renvoyée au client appelant dans la réponse GraphQL. Ajoutez la `GET_ITEM` fonction à la liste des fonctions de votre résolveur. Lorsque vous exécutez la requête, le gestionnaire de requêtes de la `GET_ITEM` fonction utilise les utilitaires fournis par le module AWS AppSync DynamoDB pour créer une `DynamoDBGetItem` demande en utilisant la clé. `id` `ddb.get({ key: { id } })`génère l'`GetItem`opération appropriée :

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

AWS AppSync utilise la demande pour récupérer les données depuis Amazon DynamoDB. Une fois les données renvoyées, elles sont gérées par le gestionnaire de réponses de la `GET_ITEM` fonction, qui vérifie les erreurs puis renvoie le résultat. 

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

Enfin, le gestionnaire de réponses du résolveur renvoie directement le résultat.

## Travailler avec des erreurs
<a name="working-with-errors"></a>

Si une erreur se produit dans votre fonction lors d'une demande, elle sera disponible dans le gestionnaire de réponse de votre fonction dans`ctx.error`. Vous pouvez ajouter l'erreur à votre réponse GraphQL à l'aide `util.appendError` de l'utilitaire. Vous pouvez rendre l'erreur accessible aux autres fonctions du pipeline en utilisant le stash. Consultez l'exemple ci-dessous :

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

# Configuration des utilitaires pour l'`APPSYNC_JS`environnement d'exécution
<a name="utility-resolvers"></a>

AWS AppSync fournit deux bibliothèques qui facilitent le développement de résolveurs avec le `APPSYNC_JS` moteur d'exécution : 
+ `@aws-appsync/eslint-plugin`- Détecte et corrige les problèmes rapidement pendant le développement.
+ `@aws-appsync/utils`- Fournit la validation de type et l'autocomplétion dans les éditeurs de code.

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

[ESLint](https://eslint.org/)est un outil qui analyse statiquement votre code pour détecter rapidement les problèmes. Vous pouvez l'exécuter dans ESLint le cadre de votre pipeline d'intégration continue. `@aws-appsync/eslint-plugin`est un ESLint plugin qui détecte une syntaxe non valide dans votre code lorsque vous utilisez le `APPSYNC_JS` runtime. Le plugin vous permet d'obtenir rapidement des commentaires sur votre code pendant le développement sans avoir à transférer vos modifications dans le cloud.

`@aws-appsync/eslint-plugin`fournit deux ensembles de règles que vous pouvez utiliser pendant le développement. 

**« plugin : @aws -appsync/base »** configure un ensemble de règles de base que vous pouvez utiliser dans votre projet : 


| Règle | Description | 
| --- | --- | 
| non asynchrone | Les processus et les promesses asynchrones ne sont pas pris en charge. | 
| sans attente | Les processus et les promesses asynchrones ne sont pas pris en charge. | 
| pas de cours | Les cours ne sont pas pris en charge. | 
| sans pour | forn'est pas pris en charge (sauf pour for-in etfor-of, qui sont pris en charge) | 
| sans continuer | continue n’est pas pris en charge. | 
| pas de générateurs | Les générateurs ne sont pas pris en charge. | 
| aucun rendement | yield n’est pas pris en charge. | 
| sans étiquettes | Les étiquettes ne sont pas prises en charge. | 
| non, ça | thisle mot clé n'est pas pris en charge. | 
| pas d'essai | La structure Try/Catch n'est pas prise en charge. | 
| sans délai | Alors que les boucles ne sont pas prises en charge. | 
| no-disallowed-unary-operators | \$1\$1--, et les opérateurs \$1 unaires ne sont pas autorisés. | 
| no-disallowed-binary-operators | L'instanceofopérateur n'est pas autorisé. | 
| sans promesse | Les processus et les promesses asynchrones ne sont pas pris en charge. | 

**« plugin : @aws -appsync/recommended »** fournit des règles supplémentaires mais vous oblige également à ajouter des TypeScript configurations à votre projet.


| Règle | Description | 
| --- | --- | 
| aucune récursion | Les appels de fonction récursifs ne sont pas autorisés. | 
| no-disallowed-methods | Certaines méthodes ne sont pas autorisées. Consultez la [référence](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) pour un ensemble complet de fonctions intégrées prises en charge. | 
| no-function-passing | Il n'est pas permis de transmettre des fonctions en tant qu'arguments à des fonctions. | 
| no-function-reassign | Les fonctions ne peuvent pas être réattribuées. | 
| no-function-return | Les fonctions ne peuvent pas être la valeur de retour des fonctions. | 

Pour ajouter le plugin à votre projet, suivez les étapes d'installation et d'utilisation décrites dans [Getting Started with ESLint](https://eslint.org/docs/latest/user-guide/getting-started#installation-and-usage). Ensuite, installez le [plugin](https://www.npmjs.com/package/@aws-appsync/eslint-plugin) dans votre projet à l'aide de votre gestionnaire de packages de projet (par exemple, npm, yarn ou pnpm) :

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

Dans votre `.eslintrc.{js,yml,json}` fichier, ajoutez **« plugin : @aws -appsync/base »** ou **« plugin : @aws -appsync/recommended** » à la propriété. `extends` L'extrait ci-dessous est un exemple de `.eslintrc` configuration de base pour : JavaScript 

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

Pour utiliser l'ensemble de règles **« plugin : @aws -appsync/recommended »**, installez la dépendance requise :

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

Créez ensuite un `.eslintrc.js` fichier :

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

# Regroupement et sources TypeScript de cartes pour l'environnement d'exécution `APPSYNC_JS`
<a name="additional-utilities"></a>

TypeScript améliore AWS AppSync le développement en garantissant la sécurité des types et la détection précoce des erreurs. Vous pouvez écrire TypeScript du code localement et le transpiler JavaScript avant de l'utiliser avec le `APPSYNC_JS` moteur d'exécution. Le processus commence par l'installation TypeScript et la configuration de tsconfig.json pour l'environnement. `APPSYNC_JS` Vous pouvez ensuite utiliser des outils de regroupement tels que esbuild pour compiler et regrouper le code. La CLI Amplify générera des types à partir du schéma GraphQL, ce qui vous permettra d'utiliser ces types dans le code du résolveur. 

Vous pouvez utiliser des bibliothèques personnalisées et externes dans votre résolveur et votre code de fonction, à condition qu'elles soient conformes aux `APPSYNC_JS` exigences. Les outils de regroupement combinent le code dans un seul fichier à utiliser dans AWS AppSync. Des cartes sources peuvent être incluses pour faciliter le débogage. 

## Tirer parti des bibliothèques et regrouper votre code
<a name="using-external-libraries"></a>

Dans votre résolveur et votre code de fonction, vous pouvez tirer parti des bibliothèques personnalisées et externes à condition qu'elles soient conformes aux `APPSYNC_JS` exigences. Cela permet de réutiliser le code existant dans votre application. Pour utiliser des bibliothèques définies par plusieurs fichiers, vous devez utiliser un outil de regroupement, tel que [esbuild](https://esbuild.github.io/), pour combiner votre code dans un seul fichier qui peut ensuite être enregistré dans votre AWS AppSync résolveur ou votre fonction.

Lorsque vous regroupez votre code, gardez les points suivants à l'esprit :
+ `APPSYNC_JS`supporte uniquement les ECMAScript modules (ESM).
+ `@aws-appsync/*`les modules sont intégrés dans votre code `APPSYNC_JS` et ne doivent pas être fournis avec celui-ci.
+ L'environnement `APPSYNC_JS` d'exécution est similaire à NodeJS dans la mesure où le code ne s'exécute pas dans un environnement de navigateur.
+ Vous pouvez inclure une carte source facultative. Cependant, n'incluez pas le contenu source.

  Pour en savoir plus sur les cartes sources, reportez-vous à la section [Utilisation des cartes sources](#source-maps).

Par exemple, pour regrouper le code de votre résolveur situé à l'adresse`src/appsync/getPost.resolver.js`, vous pouvez utiliser la commande ESbuild CLI suivante :

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

## Création de votre code et utilisation de TypeScript
<a name="working-with-typescript"></a>

[TypeScript](https://www.typescriptlang.org/)est un langage de programmation développé par Microsoft qui offre toutes JavaScript les fonctionnalités ainsi que le système de TypeScript saisie. Vous pouvez l'utiliser TypeScript pour écrire du code sécurisé et détecter les erreurs et les bogues au moment de la compilation avant d'enregistrer votre code dans. AWS AppSync Le `@aws-appsync/utils` package est entièrement dactylographié.

Le `APPSYNC_JS` moteur d'exécution ne prend pas TypeScript directement en charge. Vous devez d'abord transpiler votre TypeScript code en JavaScript code compatible avec le `APPSYNC_JS` moteur d'exécution avant de l'enregistrer. AWS AppSync Vous pouvez l'utiliser TypeScript pour écrire votre code dans votre environnement de développement intégré (IDE) local, mais notez que vous ne pouvez pas créer de TypeScript code dans la AWS AppSync console.

Pour commencer, assurez-vous que vous l'avez [TypeScript](https://www.typescriptlang.org/download)installé dans votre projet. Configurez ensuite vos paramètres de TypeScript transcompilation pour qu'ils fonctionnent avec le `APPSYNC_JS` moteur d'exécution à l'aide [TSConfig](https://www.typescriptlang.org/tsconfig)de. Voici un exemple de `tsconfig.json` fichier de base que vous pouvez utiliser :

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

Vous pouvez ensuite utiliser un outil de regroupement comme esbuild pour compiler et regrouper votre code. Par exemple, si votre AWS AppSync code se trouve dans un projet`src/appsync`, vous pouvez utiliser la commande suivante pour compiler et regrouper votre code :

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

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

Vous pouvez utiliser la [CLI Amplify](https://docs.amplify.aws/cli/) pour générer les types de votre schéma. Dans le répertoire où se trouve votre `schema.graphql` fichier, exécutez la commande suivante et passez en revue les instructions pour configurer votre codegen :

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

Pour régénérer votre codegen dans certaines circonstances (par exemple, lorsque votre schéma est mis à jour), exécutez la commande suivante :

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

Vous pouvez ensuite utiliser les types générés dans le code de votre résolveur. Par exemple, selon le schéma suivant :

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

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

type Query {
  listTodos: Todo
}
```

Vous pouvez utiliser les types générés dans l'exemple de AWS AppSync fonction suivant :

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

### Utilisation de génériques dans TypeScript
<a name="working-with-typescript-generics"></a>

Vous pouvez utiliser des génériques avec plusieurs des types fournis. Par exemple, l'extrait ci-dessous est un `Todo` type :

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

Vous pouvez écrire un résolveur pour un abonnement qui utilise. `Todo` Dans votre IDE, les définitions de type et les conseils de saisie automatique vous aideront à utiliser correctement l'utilitaire de `toSubscriptionFilter` transformation :

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

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

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

## Linting vos paquets
<a name="using-lint-with-bundles"></a>

Vous pouvez automatiquement pelucher vos bundles en important le `esbuild-plugin-eslint` plugin. Vous pouvez ensuite l'activer en fournissant une `plugins` valeur qui active les fonctionnalités eslint. Vous trouverez ci-dessous un extrait qui utilise l' JavaScript API esbuild dans un fichier appelé : `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 })],
})
```

## Utilisation de cartes sources
<a name="source-maps"></a>

Vous pouvez fournir une carte source en ligne (`sourcemap`) avec votre JavaScript code. Les cartes sources sont utiles lorsque vous regroupez JavaScript ou TypeScript codez et que vous souhaitez voir des références à vos fichiers source d'entrée dans vos journaux et dans vos messages d' JavaScript erreur d'exécution.

Vous `sourcemap` devez apparaître à la fin de votre code. Il est défini par une seule ligne de commentaire qui suit le format suivant :

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

Voici un exemple :

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

Les cartes sources peuvent être créées avec esbuild. L'exemple ci-dessous vous montre comment utiliser l' JavaScriptAPI esbuild pour inclure une carte source en ligne lors de la création et du regroupement du code :

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

En particulier, les `sourcesContent` options `sourcemap` et spécifient qu'une carte source doit être ajoutée en ligne à la fin de chaque build, mais ne doit pas inclure le contenu source. Par convention, nous vous recommandons de ne pas inclure de contenu source dans votre`sourcemap`. Vous pouvez le désactiver dans esbuild en réglant `sources-content` sur`false`.

Pour illustrer le fonctionnement des cartes sources, consultez l'exemple suivant dans lequel un code de résolution fait référence à des fonctions d'assistance d'une bibliothèque d'assistance. Le code contient des instructions de journal dans le code du résolveur et dans la bibliothèque d'assistance :

**. /src/default.resolver.ts** (votre résolveur)

```
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** (un fichier d'assistance)

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

Lorsque vous créez et regroupez le fichier de résolution, votre code de résolution inclut une carte source intégrée. Lorsque votre résolveur s'exécute, les entrées suivantes apparaissent dans les CloudWatch journaux :

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


En regardant les entrées du CloudWatch journal, vous remarquerez que les fonctionnalités des deux fichiers ont été regroupées et s'exécutent simultanément. Le nom de fichier d'origine de chaque fichier est également clairement reflété dans les journaux.

# Tester votre résolveur et vos gestionnaires de fonctions dans AWS AppSync
<a name="test-resolvers"></a>

Vous pouvez utiliser la commande `EvaluateCode` API pour tester à distance votre résolveur et vos gestionnaires de fonctions avec des données simulées avant d'enregistrer votre code dans un résolveur ou une fonction. Pour commencer à utiliser la commande, assurez-vous d'avoir ajouté l'`appsync:evaluatecode`autorisation à votre politique. Par exemple :

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

****  

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

------

Vous pouvez utiliser la commande à l'aide de la [AWS CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/index.html) ou [AWS SDKs](https://aws.amazon.com/tools/). Par exemple, pour tester votre code à l'aide de la CLI, il vous suffit de pointer sur votre fichier, de fournir un contexte et de spécifier le gestionnaire que vous souhaitez évaluer :

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

La réponse contient un `evaluationResult` contenant la charge utile renvoyée par votre gestionnaire. Il contient également un `logs` objet contenant la liste des journaux générés par votre gestionnaire lors de l'évaluation. Cela permet de déboguer facilement l'exécution de votre code et de consulter les informations relatives à votre évaluation pour vous aider à résoudre le problème. Par exemple :

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

Le résultat de l'évaluation peut être analysé au format JSON, ce qui donne :

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

À l'aide du SDK, vous pouvez facilement intégrer des tests issus de votre suite de tests pour valider le comportement de votre code. Notre exemple ici utilise le [Jest Testing Framework](https://jestjs.io/), mais n'importe quelle suite de tests fonctionne. L'extrait suivant montre une exécution de validation hypothétique. Notez que nous nous attendons à ce que la réponse d'évaluation soit un JSON valide. Nous utilisons donc `JSON.parse` pour récupérer le JSON à partir de la réponse sous forme de chaîne :

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

Cela donne le résultat suivant :

```
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 de VTL vers in JavaScript AWS AppSync
<a name="migrating-resolvers"></a>

AWS AppSync vous permet d'écrire votre logique métier pour vos résolveurs et fonctions à l'aide de VTL ou. JavaScript Dans les deux langages, vous rédigez une logique qui indique au AWS AppSync service comment interagir avec vos sources de données. Avec VTL, vous écrivez des modèles de mappage qui doivent être évalués en une chaîne codée en JSON valide. Avec JavaScript, vous écrivez des gestionnaires de requêtes et de réponses qui renvoient des objets. Vous ne renvoyez pas de chaîne codée en JSON.

Par exemple, utilisez le modèle de mappage VTL suivant pour obtenir un élément Amazon DynamoDB :

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

L'utilitaire `$util.dynamodb.toDynamoDBJson` renvoie une chaîne codée en JSON. S'il `$ctx.args.id` est défini sur`<id>`, le modèle est évalué en une chaîne codée en JSON valide :

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

Lorsque vous travaillez avec JavaScript, vous n'avez pas besoin d'imprimer des chaînes brutes codées en JSON dans votre code, et l'utilisation d'un utilitaire de ce type n'`toDynamoDBJson`est pas nécessaire. Voici un exemple équivalent du modèle de mappage ci-dessus :

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

Une alternative consiste à utiliser `util.dynamodb.toMapValues` l'approche recommandée pour gérer un objet de valeurs :

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

Cela permet d'évaluer :

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

**Note**  
Nous recommandons d'utiliser le module DynamoDB avec les sources de données DynamoDB :  

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

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

Autre exemple, prenez le modèle de mappage suivant pour placer un élément dans une source de données Amazon DynamoDB :

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

Lors de son évaluation, cette chaîne de modèle de mappage doit produire une chaîne codée en JSON valide. Lors de l'utilisation JavaScript, votre code renvoie directement l'objet de la requête :

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

qui évalue à :

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

**Note**  
Nous recommandons d'utiliser le module DynamoDB avec les sources de données DynamoDB :  

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

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

# Choisir entre un accès direct à une source de données ou un proxy via une source de données Lambda
<a name="choosing-data-source"></a>

Grâce à AWS AppSync l'`APPSYNC_JS`environnement d'exécution, vous pouvez écrire votre propre code qui implémente votre logique métier personnalisée en utilisant des AWS AppSync fonctions pour accéder à vos sources de données. Cela vous permet d'interagir directement avec des sources de données telles qu'Amazon DynamoDB, Aurora OpenSearch Serverless, Service APIs, HTTP AWS et d'autres services sans avoir à déployer de services ou d'infrastructures informatiques supplémentaires. AWS AppSync facilite également l'interaction avec une AWS Lambda fonction en configurant une source de données Lambda. Les sources de données Lambda vous permettent d'exécuter une logique métier complexe en utilisant l'ensemble complet des fonctionnalités AWS Lambda de résolution d'une requête GraphQL. Dans la plupart des cas, une AWS AppSync fonction directement connectée à sa source de données cible fournira toutes les fonctionnalités dont vous avez besoin. Dans les situations où vous devez implémenter une logique métier complexe qui n'est pas prise en charge par l'`APPSYNC_JS`environnement d'exécution, vous pouvez utiliser une source de données Lambda comme proxy pour interagir avec votre source de données cible.


|  |  |  | 
| --- |--- |--- |
|  | Intégration directe des sources de données | Source de données Lambda en tant que proxy | 
| Cas d'utilisation | AWS AppSync les fonctions interagissent directement avec les sources de données de l'API. | AWS AppSync les fonctions appelées Lambdas interagissent avec les sources de données de l'API. | 
| Environnement d’exécution | APPSYNC\$1JS (JavaScript) | Tout environnement d'exécution Lambda pris en charge | 
| Taille maximale du code | 32 000 caractères par fonction AWS AppSync | 50 Mo (compressés, pour le téléchargement direct) par Lambda | 
| Modules externes | Limité - Fonctionnalités prises en charge par APPSYNC\$1JS uniquement | Oui | 
| Appelez n'importe quel AWS service | Oui - Utilisation d'une source de données AWS AppSync HTTP | Oui - Utilisation du AWS SDK | 
| Accès à l'en-tête de la demande | Oui | Oui | 
| Accès réseau | Non | Oui | 
| Accès au système de fichiers | Non | Oui | 
| Journalisation et statistiques | Oui | Oui | 
| Construisez et testez entièrement dans AppSync | Oui | Non | 
| Démarrage à froid | Non | Non - Avec une simultanéité provisionnée | 
| Scalabilité automatique | Oui, de manière transparente par AWS AppSync | Oui, tel que configuré dans Lambda | 
| Tarification | Sans frais supplémentaires | Facturé pour l'utilisation de Lambda | 

AWS AppSync les fonctions qui s'intègrent directement à leur source de données cible sont idéales pour les cas d'utilisation suivants :
+  Interaction avec Amazon DynamoDB, Aurora Serverless et Service OpenSearch 
+  Interaction avec le protocole HTTP APIs et transmission des en-têtes entrants 
+  Interaction avec AWS les services à l'aide de sources de données HTTP (avec signature AWS AppSync automatique des demandes avec le rôle de source de données fourni) 
+  Mise en œuvre du contrôle d'accès avant d'accéder aux sources de données 
+  Implémentation du filtrage des données récupérées avant de répondre à une demande 
+  Implémentation d'une orchestration simple avec exécution séquentielle de AWS AppSync fonctions dans un pipeline de résolution 
+  Contrôle des connexions de mise en cache et d'abonnement dans les requêtes et les mutations. 

AWS AppSync les fonctions qui utilisent une source de données Lambda comme proxy sont idéales pour les cas d'utilisation suivants :
+  Utilisation d'un langage autre que JavaScript le langage VTL (Velocity Template Language) 
+  Réglage et contrôle du processeur ou de la mémoire pour optimiser les performances 
+  Importation de bibliothèques tierces ou demande de fonctionnalités non prises en charge dans `APPSYNC_JS` 
+  Effectuer plusieurs demandes réseau and/or pour obtenir l'accès au système de fichiers pour répondre à une requête 
+  Requêtes par lots à l'aide de la [configuration par lots.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-lambda-js.html) 

# AWS AppSync JavaScript référence à l'objet contextuel du résolveur
<a name="resolver-context-reference-js"></a>

AWS AppSync définit un ensemble de variables et de fonctions permettant de travailler avec les gestionnaires de demandes et de réponses. Cela facilite les opérations logiques sur les données avec GraphQL. Ce document décrit ces fonctions et fournit des exemples.

## Accès à la variable `context`
<a name="accessing-the-context-js"></a>

L'`context`argument d'un gestionnaire de demandes et de réponses est un objet qui contient toutes les informations contextuelles pour l'invocation de votre résolveur. Elle présente la structure suivante :

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

**Note**  
Vous constaterez souvent que l'`context`objet est appelé`ctx`.

Chaque champ de l'`context`objet est défini comme suit :

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

** `arguments` **  
Carte qui contient tous les arguments GraphQL pour ce champ.

** `identity` **  
Objet qui contient des informations sur l’appelant. Pour en savoir plus sur la structure de ce champ, consultez [Identité](#aws-appsync-resolver-context-reference-identity-js).

** `source` **  
Carte contenant la résolution du champ parent.

** `stash` **  
Le stash est un objet mis à disposition dans chaque résolveur et gestionnaire de fonctions. Le même objet de réserve vit après une seule exécution du résolveur. Cela signifie que vous pouvez utiliser le stash pour transmettre des données arbitraires entre les gestionnaires de requêtes et de réponses et entre les fonctions d'un résolveur de pipeline.   
Vous ne pouvez pas supprimer ou remplacer l'intégralité de la réserve, mais vous pouvez ajouter, mettre à jour, supprimer et lire les propriétés de la réserve. 
Vous pouvez ajouter des objets à la réserve en modifiant l'un des exemples de code ci-dessous :  

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

//Example 2
Object.assign(ctx.stash, {key1: value1, key2: value})
```
Vous pouvez supprimer des objets de la réserve en modifiant le code ci-dessous :  

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

** `result` **  
Un conteneur pour les résultats de ce résolveur. Ce champ n'est disponible que pour les gestionnaires de réponses.  
Par exemple, si vous résolvez le `author` champ de la requête suivante :  

```
query {
    getPost(id: 1234) {
        postId
        title
        content
        author {
            id
            name
        }
    }
}
```
La `context` variable complète est alors disponible lorsqu'un gestionnaire de réponses est évalué :  

```
{
  "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` **  
Le résultat de toute opération précédente exécutée dans un résolveur de pipeline.  
Si l'opération précédente était le gestionnaire de requêtes du résolveur de pipeline, elle `ctx.prev.result` représente le résultat de l'évaluation et est mise à la disposition de la première fonction du pipeline.  
Si l'opération précédente était la première fonction, elle `ctx.prev.result` représente le résultat de l'évaluation du gestionnaire de réponse de la première fonction et est mise à la disposition de la deuxième fonction du pipeline.  
Si l'opération précédente était la dernière fonction, elle `ctx.prev.result` représente le résultat de l'évaluation de la dernière fonction et est mise à la disposition du gestionnaire de réponses du résolveur de pipeline.

** `info` **  
Objet qui contient des informations sur la demande GraphQL. Pour obtenir la structure de ce champ, veuillez consulter [Infos](#aws-appsync-resolver-context-reference-info-js).

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

La section `identity` contient les informations sur l'appelant. La forme de cette section dépend du type d'autorisation de votre AWS AppSync API.

Pour plus d'informations sur les options AWS AppSync de sécurité, consultez la section [Autorisation et authentification](security-authz.md#aws-appsync-security).

** Autorisation `API_KEY`**  
Le `identity` champ n'est pas renseigné.

**Autorisation `AWS_LAMBDA`**  
`identity`Il a la forme suivante :  

```
type AppSyncIdentityLambda = {
  resolverContext: any;
};
```
`identity`Il contient la `resolverContext` clé, contenant le même `resolverContext` contenu renvoyé par la fonction Lambda autorisant la demande.

** Autorisation `AWS_IAM`**  
`identity`Il a la forme suivante :  

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

** Autorisation `AMAZON_COGNITO_USER_POOLS`**  
`identity`Il a la forme suivante :  

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

Chaque champ est défini comme suit :

** `accountId` **  
L'identifiant du AWS compte de l'appelant.

** `claims` **  
Demandes de l'utilisateur.

** `cognitoIdentityAuthType` **  
Authentifié ou non authentifié en fonction du type d'identité.

** `cognitoIdentityAuthProvider` **  
Liste séparée par des virgules des informations du fournisseur d'identité externe utilisées pour obtenir les informations d'identification utilisées pour signer la demande.

** `cognitoIdentityId` **  
L'identifiant Amazon Cognito de l'appelant.

** `cognitoIdentityPoolId` **  
L'ID du pool d'identités Amazon Cognito associé à l'appelant.

** `defaultAuthStrategy` **  
Stratégie d'autorisation par défaut pour cet appelant (`ALLOW` ou `DENY`).

** `issuer` **  
Émetteur du jeton.

** `sourceIp` **  
Adresse IP source de l'appelant qui AWS AppSync reçoit. Si la demande n'inclut pas l'`x-forwarded-for`en-tête, la valeur IP source ne contient qu'une seule adresse IP provenant de la connexion TCP. Si la demande inclut un en-tête `x-forwarded-for`, l'adresse IP source est une liste d'adresses IP de l'en-tête `x-forwarded-for` en plus de l'adresse IP de la connexion TCP.

** `sub` **  
UUID de l'utilisateur authentifié.

** `user` **  
Utilisateur IAM.

** `userArn` **  
Le nom de ressource Amazon (ARN) de l'utilisateur IAM.

** `username` **  
Nom de l'utilisateur authentifié. En cas d'autorisation `AMAZON_COGNITO_USER_POOLS`, la valeur de *username* est la valeur de l’attribut *cognito:username*. Dans le cas d'`AWS_IAM`une autorisation, la valeur du *nom d'utilisateur* est la valeur de l' AWS utilisateur principal. Si vous utilisez l'autorisation IAM avec des informations d'identification provenant de pools d'identités Amazon Cognito, nous vous recommandons d'utiliser. `cognitoIdentityId`

### En-têtes de demande d'accès
<a name="aws-appsync-resolver-context-reference-util-js"></a>

AWS AppSync permet de transmettre des en-têtes personnalisés depuis les clients et d'y accéder dans vos résolveurs GraphQL en utilisant. `ctx.request.headers` Vous pouvez ensuite utiliser les valeurs d'en-tête pour des actions telles que l'insertion de données dans une source de données ou les contrôles d'autorisation. Vous pouvez utiliser un ou plusieurs en-têtes de demande à l'`$curl`aide d'une clé d'API depuis la ligne de commande, comme indiqué dans les exemples suivants :

**Exemple d'en-tête unique** 

Supposons que vous définissiez un en-tête `custom` avec la valeur `nadia`, comme suit :

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

Il est alors possible d'y accéder avec `ctx.request.headers.custom`. Par exemple, cela peut se trouver dans le code suivant pour DynamoDB :

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

**Exemple d'en-tête multiple** 

Vous pouvez également transmettre plusieurs en-têtes dans une seule demande et y accéder dans le gestionnaire de résolution. Par exemple, si l'`custom`en-tête est défini avec deux valeurs :

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

Vous pouvez ensuite y accéder comme s'il s'agissait d'un tableau : par exemple, `ctx.request.headers.custom[1]`.

**Note**  
AWS AppSync n'expose pas l'en-tête du cookie dans`ctx.request.headers`.

### Accédez au nom de domaine personnalisé de la demande
<a name="aws-access-requested-custom-domain-names-js"></a>

AWS AppSync prend en charge la configuration d'un domaine personnalisé que vous pouvez utiliser pour accéder à votre GraphQL et à vos points de terminaison en temps réel. APIs Lorsque vous faites une demande avec un nom de domaine personnalisé, vous pouvez obtenir le nom de domaine en utilisant`ctx.request.domainName`.

Lorsque vous utilisez le nom de domaine du point de terminaison GraphQL par défaut, la valeur est. `null`

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

La section `info` contient des informations sur la demande GraphQL. Cette section se présente sous la forme suivante :

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

Chaque champ est défini comme suit :

** `fieldName` **  
Nom du champ en cours de résolution.

** `parentTypeName` **  
Nom du type parent du champ en cours de résolution.

** `variables` **  
Carte qui contient toutes les variables transmises dans la demande GraphQL.

** `selectionSetList` **  
Représentation sous forme de liste des champs du jeu de sélection GraphQL. Les champs dotés d'un alias sont référencés uniquement par le nom de l'alias, et non par le nom du champ. L'exemple suivant détaille cela.

** `selectionSetGraphQL` **  
Représentation sous forme de chaîne du jeu de sélection, formatée en langage SDL GraphQL. Bien que les fragments ne soient pas fusionnés dans le jeu de sélection, les fragments intégrés sont conservés, comme le montre l'exemple suivant.

**Note**  
`JSON.stringify`n'inclura pas `selectionSetGraphQL` et `selectionSetList` dans la sérialisation des chaînes. Vous devez référencer ces propriétés directement.

Par exemple, si vous résolvez le champ `getPost` de la requête suivante :

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

La `ctx.info` variable complète disponible lors du traitement d'un gestionnaire peut alors être :

```
{
  "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`n'expose que les champs appartenant au type actuel. Si le type actuel est une interface ou une union, seuls les champs sélectionnés appartenant à l'interface sont exposés. Par exemple, selon le schéma suivant :

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

Et la requête suivante :

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

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

Lors de l'appel `ctx.info.selectionSetList` à la résolution du `Query.node` champ, seul `id` est exposé :

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

# AWS AppSync JavaScript fonctionnalités d'exécution pour les résolveurs et les fonctions
<a name="resolver-util-reference-js"></a>

L'environnement `APPSYNC_JS` d'exécution fournit des fonctionnalités similaires à la [version 6.0 ECMAScript (ES)](https://262.ecma-international.org/6.0/). Il prend en charge un sous-ensemble de ses fonctionnalités et fournit des méthodes supplémentaires (utilitaires) qui ne font pas partie des spécifications ES. Les rubriques suivantes répertorient toutes les fonctionnalités linguistiques prises en charge :
+  [Fonctionnalités d'exécution prises](https://docs.aws.amazon.com/appsync/latest/devguide/supported-features.html) en charge - En savoir plus sur les fonctionnalités de base prises en charge, les objets primitifs, les objets et fonctions intégrés, etc.
+  [Utilitaires intégrés](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html) - La variable util contient des méthodes utilitaires générales pour vous aider à travailler avec les données. Sauf indication contraire, tous les utilitaires emploient le jeu de caractères UTF-8.
+  [Modules intégrés](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-modules-js.html) - Découvrez comment les modules intégrés peuvent aider à écrire des JavaScript résolveurs et des fonctions.
+  [Utilitaires](https://docs.aws.amazon.com/appsync/latest/devguide/runtime-utils-js.html) d'exécution - La bibliothèque d'exécution fournit des utilitaires permettant de contrôler ou de modifier les propriétés d'exécution de vos résolveurs et fonctions.
+  [Assistants temporels dans util.time - La variable util.time](https://docs.aws.amazon.com/appsync/latest/devguide/time-helpers-in-util-time-js.html) contient des méthodes datetime permettant de générer des horodatages, de convertir des formats de date/heure et d'analyser des chaînes de date/heure. La syntaxe des formats datetime est basée sur celle-ci [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html), à laquelle vous pouvez vous référer pour de plus amples informations.
+  [Les aides DynamoDB dans util.dynamodb](https://docs.aws.amazon.com/appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html) - util.dynamodb contient des méthodes d'assistance qui facilitent l'écriture et la lecture de données sur Amazon DynamoDB, telles que le mappage automatique des types et le formatage.
+  [Helpers HTTP dans util.http - L'utilitaire util.http](https://docs.aws.amazon.com/appsync/latest/devguide/http-helpers-in-utils-http-js.html) fournit des méthodes d'assistance que vous pouvez utiliser pour gérer les paramètres des requêtes HTTP et pour ajouter des en-têtes de réponse.
+  [Assistants à la transformation dans util.transform](https://docs.aws.amazon.com/appsync/latest/devguide/transformation-helpers-in-utils-transform-js.html) - util.transform contient des méthodes d'assistance qui facilitent l'exécution d'opérations complexes sur des sources de données.
+  [Les assistants de chaîne dans util.str - util.str](https://docs.aws.amazon.com/appsync/latest/devguide/str-helpers-in-util-str-js.html) contiennent des méthodes pour faciliter les opérations courantes sur les chaînes de caractères.
+  [Extensions](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html) : les extensions contiennent un ensemble de méthodes permettant d'effectuer des actions supplémentaires dans vos résolveurs.
+  [Les aides XML du fichier util.xml](https://docs.aws.amazon.com/appsync/latest/devguide/xml-helpers-in-util-xml-js.html) - util.xml contiennent des méthodes pour faciliter la conversion de chaînes XML.

**Note**  
Actuellement, cette référence ne s'applique qu'à la version d'exécution **1.0.0**.

# Fonctionnalités d'exécution prises en charge
<a name="supported-features"></a>

Les sections ci-dessous décrivent l'ensemble des fonctionnalités prises en charge par le moteur d'exécution APPSYNC\$1JS.

## Fonctions de base
<a name="core-features"></a>

Les fonctionnalités principales suivantes sont prises en charge.

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

Les types suivants sont pris en charge :
+ nombres
+ chaînes
+ booléens
+ objects
+ tableaux
+ functions

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

Les opérateurs sont pris en charge, notamment :
+ opérateurs mathématiques standard (`+`, `-``/`,`%`,`*`,, etc.)
+ opérateur de coalescence nul () `??`
+ Chainage optionnel () `?.`
+ opérateurs bit à bit
+ `void`et `typeof` opérateurs
+ opérateurs de propagation (`...`)

Les opérateurs suivants ne sont pas pris en charge :
+ opérateurs unaires (`++`,`--`, et`~`)
+ Opérateur `in`
**Note**  
Utilisez l'`Object.hasOwn`opérateur pour vérifier si la propriété spécifiée se trouve dans l'objet spécifié.

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

Les déclarations suivantes sont prises en charge :
+ `const`
+ `let`
+ `var`
+ `break`
+ `else`
+ `for-in`
+ `for-of` 
+ `if`
+ `return`
+ `switch`
+ syntaxe de propagation

Les éléments suivants ne sont pas pris en charge :
+ `catch`
+ `continue`
+ `do-while`
+ `finally`
+ `for(initialization; condition; afterthought)`
**Note**  
Les exceptions sont les `for-of` expressions `for-in` et les expressions, qui sont prises en charge.
+ `throw`
+ `try`
+ `while`
+ déclarations étiquetées

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

Les [littéraux de modèle](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) ES 6 suivants sont pris en charge :
+ Cordes multilignes
+ Interpolation d'expressions
+ Modèles d'imbrication

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

La syntaxe de fonction suivante est prise en charge :
+ Les déclarations de fonctions sont prises en charge.
+ Les fonctions de flèche ES 6 sont prises en charge.
+ La syntaxe des paramètres de repos ES 6 est prise en charge.

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

Les fonctions opèrent en mode strict par défaut. Vous n’avez donc pas besoin d’ajouter une instruction `use_strict` dans votre code de fonction. Elles ne peuvent pas être modifiées.

------

## Objets primitifs
<a name="primitive-objects"></a>

Les objets primitifs suivants d'ES et leurs fonctions sont pris en charge.

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

Les objets suivants sont pris en charge :
+ `Object.assign()`
+ `Object.entries()` 
+ `Object.hasOwn()`
+ `Object.keys()` 
+ `Object.values()`
+ `delete` 

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

Les chaînes suivantes sont prises en charge :
+  `String.prototype.length()` 
+  `String.prototype.charAt()` 
+  `String.prototype.concat()` 
+  `String.prototype.endsWith()` 
+  `String.prototype.indexOf()` 
+  `String.prototype.lastIndexOf()` 
+  `String.raw()` 
+  `String.prototype.replace()`
**Note**  
Les expressions régulières ne sont pas prises en charge.   
Cependant, les constructions d'expressions régulières de style Java sont prises en charge dans le paramètre fourni. Pour plus d'informations, voir [Motif](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html).
+ `String.prototype.replaceAll()`
**Note**  
Les expressions régulières ne sont pas prises en charge.  
Cependant, les constructions d'expressions régulières de style Java sont prises en charge dans le paramètre fourni. Pour plus d'informations, voir [Motif](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 ]

Les numéros suivants sont pris en charge :
+  `Number.isFinite` 
+  `Number.isNaN` 

------

## Objets et fonctions intégrés
<a name="built-in-objects-functions"></a>

Les fonctions et objets suivants sont pris en charge.

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

Les fonctions mathématiques suivantes sont prises en charge :
+  `Math.random()` 
+  `Math.min()` 
+  `Math.max()` 
+  `Math.round()` 
+  `Math.floor()` 
+  `Math.ceil()` 

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

Les méthodes matricielles suivantes sont prises en charge :
+ `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()`
**Note**  
`Array.prototype.sort()`ne supporte pas les arguments.
+ `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 ]

L'objet console est disponible pour le débogage. Pendant l'exécution des requêtes en direct, les log/error instructions de console sont envoyées à Amazon CloudWatch Logs (si la journalisation est activée). Lors de l'évaluation du code avec`evaluateCode`, les instructions de journal sont renvoyées dans la réponse à la commande.
+ `console.error()`
+ `console.log()`

------
#### [ Function ]
+ Les `call` méthodes `apply``bind`, et ne sont pas prises en charge.
+ Les constructeurs de fonctions ne sont pas pris en charge.
+ La transmission d'une fonction en tant qu'argument n'est pas prise en charge.
+ Les appels de fonction récursifs ne sont pas pris en charge.

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

Les méthodes JSON suivantes sont prises en charge :
+ `JSON.parse()`
**Note**  
Renvoie une chaîne vide si la chaîne analysée n'est pas un JSON valide.
+ `JSON.stringify()`

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

Les processus asynchrones ne sont pas pris en charge et les promesses ne sont pas prises en charge.

**Note**  
L'accès au réseau et au système de fichiers n'est pas pris en charge au cours de l'`APPSYNC_JS`exécution dans AWS AppSync. AWS AppSync gère toutes les opérations d'E/S en fonction des demandes faites par le AWS AppSync résolveur ou AWS AppSync la fonction.

------

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

Les constantes globales suivantes sont prises en charge :
+  `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`

## Types d’erreurs
<a name="error-types"></a>

Le renvoi d'erreurs avec n'`throw`est pas pris en charge. Vous pouvez renvoyer une erreur en utilisant `util.error()` la fonction. Vous pouvez inclure une erreur dans votre réponse GraphQL en utilisant la `util.appendError` fonction.

Pour plus d'informations, consultez la section [Utils d'erreur](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-util-js.html#utility-helpers-in-error-js).

# Utilitaires intégrés
<a name="built-in-util-js"></a>

La `util` variable contient des méthodes utilitaires générales pour vous aider à travailler avec les données. Sauf indication contraire, tous les utilitaires emploient le jeu de caractères UTF-8.

## Utilitaires d'encodage
<a name="utility-helpers-in-encoding"></a>

### Liste des utilitaires d'encodage
<a name="utility-helpers-in-encoding-list-js"></a>

 **`util.urlEncode(String)`**  
Renvoie la chaîne en entrée sous la forme d'une chaîne codée `application/x-www-form-urlencoded`.

 **`util.urlDecode(String)`**  
Décode une chaîne codée `application/x-www-form-urlencoded` sous sa forme initiale non codée.

**`util.base64Encode(string) : string`**  
Code les données d'entrée en une chaîne codée en base64.

**`util.base64Decode(string) : string`**  
Décode les données d’une chaîne encodée en base64.

## Utilitaires de génération d'identifiants
<a name="utility-helpers-in-id-gen-js"></a>

### Liste des utilitaires de génération d'identifiants
<a name="utility-helpers-in-id-gen-list-js"></a>

 **`util.autoId()`**  
Renvoie un UUID 128 bits généré de façon aléatoire.

**`util.autoUlid()`**  
Renvoie un ULID (identifiant lexicographiquement sortable universel unique) de 128 bits généré aléatoirement.

**`util.autoKsuid()`**  
Renvoie un KSUID (K-Sortable Unique Identifier) de 128 bits généré aléatoirement en base62 et codé sous forme de chaîne d'une longueur de 27.

## Utils d'erreur
<a name="utility-helpers-in-error-js"></a>

### Liste des utilitaires d'erreur
<a name="utility-helpers-in-error-list-js"></a>

 **`util.error(String, String?, Object?, Object?)`**  
Lève une erreur personnalisée. Peut être utilisé dans les modèles de mappage de demande ou de réponse si le modèle détecte une erreur associée à la demande ou au résultat de l'appel. En outre, un `errorType` champ, un `data` champ et un `errorInfo` champ peuvent être spécifiés. La valeur `data` sera ajoutée au bloc `error` correspondant à l'intérieur d'`errors` dans la réponse GraphQL.  
`data`sera filtré en fonction de l'ensemble de sélection de requêtes. La valeur `errorInfo` sera ajoutée au bloc `error` correspondant à l'intérieur d'`errors` dans la réponse GraphQL.  
`errorInfo`**ne sera pas** filtré en fonction de l'ensemble de sélection de requêtes.

 **`util.appendError(String, String?, Object?, Object?)`**  
Ajoute une erreur personnalisée. Peut être utilisé dans les modèles de mappage de demande ou de réponse si le modèle détecte une erreur associée à la demande ou au résultat de l'appel. En outre, un `errorType` champ, un `data` champ et un `errorInfo` champ peuvent être spécifiés. Contrairement à `util.error(String, String?, Object?, Object?)`, l'évaluation du modèle n'est pas interrompue et, par conséquent, les données peuvent être retournées à l'appelant. La valeur `data` sera ajoutée au bloc `error` correspondant à l'intérieur d'`errors` dans la réponse GraphQL.  
`data`sera filtré en fonction de l'ensemble de sélection de requêtes. La valeur `errorInfo` sera ajoutée au bloc `error` correspondant à l'intérieur d'`errors` dans la réponse GraphQL.  
`errorInfo`**ne sera pas** filtré en fonction de l'ensemble de sélection de requêtes.

## Utilitaires de correspondance de types et de modèles
<a name="utility-helpers-in-patterns-js"></a>

### Liste d'utilitaires correspondant au type et au modèle
<a name="utility-helpers-in-patterns-js-list"></a>

**`util.matches(String, String) : Boolean`**  
Renvoie la valeur true si le modèle spécifié dans le premier argument correspond aux données fournies dans le deuxième argument. Le modèle doit être une expression régulière, telle que `util.matches("a*b", "aaaaab")`. La fonctionnalité est basée sur [Pattern](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html), que vous pouvez référencer à titre de documentation ultérieure.

 **`util.authType()`**   
Renvoie une chaîne décrivant le type d'authentification multiple utilisé par une demande, renvoyant soit « IAM Authorization », « User Pool Authorization », « Open ID Connect Authorization », soit « API Key Authorization ».

## Utilitaires de comportement des valeurs renvoyées
<a name="utility-helpers-in-cloudwatch-logs-list-js"></a>

### Liste des utilitaires relatifs au comportement des valeurs renvoyées
<a name="utility-helpers-in-behavior-list-js"></a>

 **`util.escapeJavaScript(String)`**  
Renvoie la chaîne d'entrée sous forme de chaîne JavaScript échappée.

## Utilitaires d'autorisation du résolveur
<a name="utility-helpers-in-resolver-auth-js"></a>

### Liste des utilitaires d'autorisation du résolveur
<a name="utility-helpers-in-resolver-auth-list-js"></a>

 **`util.unauthorized()`**  
Lève `Unauthorized` pour le champ en cours de résolution. Utilisez-le dans les modèles de mappage de demandes ou de réponses pour déterminer s'il convient d'autoriser l'appelant à résoudre le champ.

# Modules intégrés
<a name="built-in-modules-js"></a>

Les modules font partie de l'`APPSYNC_JS`environnement d'exécution et fournissent des utilitaires pour aider à écrire des JavaScript résolveurs et des fonctions. Pour des exemples et des exemples, consultez le [aws-appsync-resolver-samples](https://github.com/aws-samples/aws-appsync-resolver-samples) GitHub référentiel.

## Fonctions du module DynamoDB
<a name="built-in-ddb-modules"></a>

Les fonctions du module DynamoDB offrent une expérience améliorée lors de l'interaction avec les sources de données DynamoDB. Vous pouvez envoyer des requêtes à vos sources de données DynamoDB à l'aide des fonctions et sans ajouter de mappage de type. 

Les modules sont importés à l'aide de `@aws-appsync/utils/dynamodb` :

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

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

#### Liste des fonctions
<a name="built-in-ddb-modules-functions-list"></a>

 **` get<T>(payload: GetInput): DynamoDBGetItemRequest`**  
Voir [Inputs](#built-in-ddb-modules-inputs) pour plus d'informations sur GetInput.
Génère un `DynamoDBGetItemRequest` objet pour envoyer une [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-getitem)requête à DynamoDB.  

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

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

 **`put<T>(payload): DynamoDBPutItemRequest`**  
Génère un `DynamoDBPutItemRequest` objet pour envoyer une [PutItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem)requête à DynamoDB.  

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

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

**`remove<T>(payload): DynamoDBDeleteItemRequest`**  
Génère un `DynamoDBDeleteItemRequest` objet pour envoyer une [DeleteItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-deleteitem)requête à DynamoDB.  

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

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

**`scan<T>(payload): DynamoDBScanRequest`**  
Génère un `DynamoDBScanRequest` pour envoyer une demande de [scan](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan) à DynamoDB.  

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

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

**`sync<T>(payload): DynamoDBSyncRequest`**  
Génère un `DynamoDBSyncRequest` objet pour effectuer une demande de [synchronisation](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-sync). La demande ne reçoit que les données modifiées depuis la dernière requête (mises à jour delta). Les demandes peuvent uniquement être adressées à des sources de données DynamoDB versionnées.  

```
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`**  
Génère un `DynamoDBUpdateItemRequest` objet pour envoyer une [UpdateItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-updateitem)requête à DynamoDB.

### Opérations
<a name="built-in-ddb-modules-operations"></a>

Les aides aux opérations vous permettent d'effectuer des actions spécifiques sur certaines parties de vos données lors des mises à jour. Pour commencer, importez `operations` depuis `@aws-appsync/utils/dynamodb` :

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

#### Liste des opérations
<a name="built-in-ddb-modules-operations-list"></a>

 **`add<T>(payload)`**  
Fonction d'assistance qui ajoute un nouvel élément d'attribut lors de la mise à jour de DynamoDB.  
**Exemple**  
Pour ajouter une adresse (rue, ville et code postal) à un élément DynamoDB existant à l'aide de la valeur ID :  

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

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

**`append <T>(payload)`**  
Fonction d'assistance qui ajoute une charge utile à la liste existante dans DynamoDB.  
**Exemple**  
Pour ajouter un ami IDs (`newFriendIds`) récemment ajouté à une liste d'amis existante (`friendsIds`) lors d'une mise à jour :  

```
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?)`**  
Fonction d'assistance qui décrémente la valeur d'attribut existante dans l'élément lors de la mise à jour de DynamoDB.  
**Exemple**  
Pour réduire le compteur (`friendsCount`) d'un ami de 10 :  

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

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

**`increment (by?)`**  
Fonction d'assistance qui incrémente la valeur d'attribut existante dans l'élément lors de la mise à jour de DynamoDB.  
**Exemple**  
Pour augmenter de 10 le compteur d'amis (`friendsCount`) :  

```
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)`**  
Fonction d'assistance qui ajoute un préfixe à la liste existante dans DynamoDB.  
**Exemple**  
Pour ajouter un nouvel ami IDs (`newFriendIds`) à une liste d'amis existante (`friendsIds`) lors d'une mise à jour :  

```
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)`**  
Fonction d'assistance qui remplace un attribut existant lors de la mise à jour d'un élément dans DynamoDB. Cela est utile lorsque vous souhaitez mettre à jour l'intégralité de l'objet ou du sous-objet de l'attribut et pas uniquement les clés de la charge utile.  
**Exemple**  
Pour remplacer une adresse (rue, ville et code postal) dans un `info` objet :  

```
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)`**  
Fonction d'assistance qui remplace un élément d'une liste.  
**Exemple**  
Dans le cadre de la mise à jour (`newFriendIds`), cet exemple a `updateListItem` été utilisé pour mettre à jour les valeurs d'ID du deuxième élément (index :`1`, new ID :`102`) et du troisième élément (index :`2`, new ID :`112`) dans une liste (`friendsIds`).  

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

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

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

#### Liste des entrées
<a name="built-in-ddb-modules-inputs-list"></a>

 **`Type GetInput<T>`**  

```
GetInput<T>: { 
    consistentRead?: boolean; 
    key: DynamoDBKey<T>; 
}
```
**Déclaration de type**  
+ `consistentRead?: boolean` (facultatif)

  Un booléen facultatif qui indique si vous souhaitez effectuer une lecture très cohérente avec DynamoDB.
+ `key: DynamoDBKey<T>` (obligatoire)

  Paramètre obligatoire qui spécifie la clé de l'élément dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou des clés de hachage et de tri.

**`Type PutInput<T>`**  

```
PutInput<T>: { 
    _version?: number; 
    condition?: DynamoDBFilterObject<T> | null; 
    customPartitionKey?: string; 
    item: Partial<T>; 
    key: DynamoDBKey<T>; 
    populateIndexFields?: boolean; 
}
```
**Déclaration de type**  
+ `_version?: number` (facultatif)
+ `condition?: DynamoDBFilterObject<T> | null` (facultatif)

  Lorsque vous placez un objet dans une table DynamoDB, vous pouvez éventuellement spécifier une expression conditionnelle qui détermine si la demande doit aboutir ou non en fonction de l'état de l'objet déjà présent dans DynamoDB avant l'exécution de l'opération.
+ `customPartitionKey?: string` (facultatif)

  Lorsqu'elle est activée, cette valeur de chaîne modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le versionnement est activé. Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. 
+ `item: Partial<T>` (obligatoire)

  Le reste des attributs de l'élément à placer dans DynamoDB.
+ `key: DynamoDBKey<T>` (obligatoire)

  Paramètre obligatoire qui spécifie la clé de l'élément dans DynamoDB sur lequel le placement sera effectué. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou des clés de hachage et de tri.
+ `populateIndexFields?: boolean` (facultatif)

  Valeur booléenne qui, lorsqu'elle est activée en même temps que le`customPartitionKey`, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`gsi_ds_sk`. Pour plus d'informations, consultez la section [Détection et synchronisation des conflits](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *manuel du AWS AppSync développeur*.

**`Type QueryInput<T>`**  

```
QueryInput<T>: ScanInput<T> & { 
    query: DynamoDBKeyCondition<Required<T>>; 
}
```
**Déclaration de type**  
+ `query: DynamoDBKeyCondition<Required<T>>` (obligatoire)

  Spécifie une condition clé qui décrit les éléments à interroger. Pour un index donné, la condition d'une clé de partition doit être une égalité et la clé de tri une comparaison ou un `beginsWith` (lorsqu'il s'agit d'une chaîne). Seuls les types de nombres et de chaînes sont pris en charge pour les clés de partition et de tri.

  **Exemple**

  Prenez le `User` type ci-dessous :

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

  La requête ne peut inclure que les champs suivants : `id``name`, et `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; 
}
```
**Déclaration de type**  
+ `_version?: number` (facultatif)
+ `condition?: DynamoDBFilterObject<T>` (facultatif)

  Lorsque vous supprimez un objet dans DynamoDB, vous pouvez éventuellement spécifier une expression conditionnelle qui détermine si la demande doit aboutir ou non en fonction de l'état de l'objet déjà présent dans DynamoDB avant l'exécution de l'opération.

  **Exemple**

  L'exemple suivant est une `DeleteItem` expression contenant une condition qui permet à l'opération de réussir uniquement si le propriétaire du document correspond à l'utilisateur qui fait la demande.

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

  Lorsqu'elle est activée, la `customPartitionKey` valeur modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le versionnement est activé. Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. 
+ `key: DynamoDBKey<T>` (obligatoire)

  Paramètre obligatoire qui spécifie la clé de l'élément en cours de suppression dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou des clés de hachage et de tri.

  **Exemple**

  Si a `User` uniquement la clé de hachage d'un utilisateur`id`, la clé ressemblera à ceci :

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

  Si l'utilisateur de la table possède une clé de hachage (`id`) et une clé de tri (`name`), la clé ressemblera à ceci :

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

  Valeur booléenne qui, lorsqu'elle est activée en même temps que le`customPartitionKey`, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`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; 
}
```
**Déclaration de type**  
+ `consistentRead?: boolean | null` (facultatif)

  Un booléen facultatif pour indiquer des lectures cohérentes lors de l'interrogation de DynamoDB. La valeur par défaut est `false`.
+ `filter?: DynamoDBFilterObject<T> | null` (facultatif)

  Filtre facultatif à appliquer aux résultats après les avoir extraits du tableau.
+ `index?: string | null` (facultatif)

  Nom facultatif de l'index à analyser.
+ `limit?: number | null` (facultatif)

  Nombre maximal facultatif de résultats à renvoyer.
+ `nextToken?: string | null` (facultatif)

  Un jeton de pagination facultatif pour poursuivre une requête précédente. Il a été obtenu à partir d'une requête précédente.
+ `scanIndexForward?: boolean | null` (facultatif)

  Un booléen facultatif indiquant si la requête est exécutée par ordre croissant ou décroissant. Par défaut, cette valeur indique `true`.
+ `segment?: number` (facultatif)
+ `select?: DynamoDBSelectAttributes` (facultatif)

  Attributs à renvoyer depuis DynamoDB. Par défaut, le résolveur AWS AppSync DynamoDB renvoie uniquement les attributs projetés dans l'index. Les valeurs prises en charge sont :
  + `ALL_ATTRIBUTES`

    Renvoie tous les attributs d'élément de la table ou de l'index spécifié. Si vous interrogez un index secondaire local, DynamoDB extrait l'élément entier de la table parent pour chaque élément correspondant de l'index. Si l'index est configuré de façon à projeter tous les attributs de l'élément, toutes les données peuvent être obtenues à partir de l'index secondaire local, et aucune extraction n'est nécessaire.
  + `ALL_PROJECTED_ATTRIBUTES`

    Renvoie tous les attributs qui ont été projetés dans l'index. Si l'index est configuré de façon à projeter tous les attributs, la valeur renvoyée revient à spécifier `ALL_ATTRIBUTES`.
  + `SPECIFIC_ATTRIBUTES`

    Renvoie uniquement les attributs répertoriés dans`ProjectionExpression`. Cette valeur de retour revient à spécifier `ProjectionExpression` sans spécifier de valeur pour`AttributesToGet`.
+ `totalSegments?: number` (facultatif)

**`Type DynamoDBSyncInput<T>`**  

```
DynamoDBSyncInput<T>: { 
    basePartitionKey?: string; 
    deltaIndexName?: string; 
    filter?: DynamoDBFilterObject<T> | null; 
    lastSync?: number; 
    limit?: number | null; 
    nextToken?: string | null; 
}
```
**Déclaration de type**  
+ `basePartitionKey?: string` (facultatif)

  La clé de partition de la table de base à utiliser lors d'une opération de synchronisation. Ce champ permet d'effectuer une opération de synchronisation lorsque la table utilise une clé de partition personnalisée.
+ `deltaIndexName?: string` (facultatif)

  Index utilisé pour l'opération de synchronisation. Cet index est nécessaire pour activer une opération de synchronisation sur l'ensemble de la table delta store lorsque la table utilise une clé de partition personnalisée. L'opération de synchronisation sera effectuée sur le GSI (créé sur `gsi_ds_pk` et`gsi_ds_sk`).
+ `filter?: DynamoDBFilterObject<T> | null` (facultatif)

  Filtre facultatif à appliquer aux résultats après les avoir extraits du tableau.
+ `lastSync?: number` (facultatif)

  Moment, en millisecondes, auquel la dernière opération de synchronisation réussie a commencé. Si spécifié, seuls les éléments qui ont changé après `lastSync` sont retournés. Ce champ ne doit être rempli qu'après avoir récupéré toutes les pages d'une opération de synchronisation initiale. En cas d'omission, les résultats de la table de base seront renvoyés. Dans le cas contraire, les résultats de la table delta seront renvoyés.
+ `limit?: number | null` (facultatif)

  Nombre maximal facultatif d'éléments à évaluer simultanément. Si cette option est omise, la limite par défaut sera définie sur `100` éléments. La valeur maximale de ce champ est `1000` éléments.
+ `nextToken?: string | null` (facultatif)

**`Type DynamoDBUpdateInput<T>`**  

```
DynamoDBUpdateInput<T>: { 
    _version?: number; 
    condition?: DynamoDBFilterObject<T>; 
    customPartitionKey?: string; 
    key: DynamoDBKey<T>; 
    populateIndexFields?: boolean; 
    update: DynamoDBUpdateObject<T>; 
}
```
**Déclaration de type**  
+ `_version?: number` (facultatif)
+ `condition?: DynamoDBFilterObject<T>` (facultatif)

  Lorsque vous mettez à jour un objet dans DynamoDB, vous pouvez éventuellement spécifier une expression conditionnelle qui détermine si la demande doit aboutir ou non en fonction de l'état de l'objet déjà présent dans DynamoDB avant l'exécution de l'opération.
+ `customPartitionKey?: string` (facultatif)

  Lorsqu'elle est activée, la `customPartitionKey` valeur modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le versionnement est activé. Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. 
+ `key: DynamoDBKey<T>` (obligatoire)

  Paramètre obligatoire qui spécifie la clé de l'élément en cours de mise à jour dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou des clés de hachage et de tri.
+ `populateIndexFields?: boolean` (facultatif)

  Valeur booléenne qui, lorsqu'elle est activée en même temps que le`customPartitionKey`, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`gsi_ds_sk`. 
+ `update: DynamoDBUpdateObject<T>`

  Objet qui spécifie les attributs à mettre à jour ainsi que leurs nouvelles valeurs. L'objet de mise à jour peut être utilisé avec `add` `remove``replace`,`increment`,,`decrement`,`append`,`prepend`,`updateListItem`.

## Fonctions du module Amazon RDS
<a name="built-in-rds-modules"></a>

Les fonctions du module Amazon RDS offrent une expérience améliorée lors de l'interaction avec les bases de données configurées avec l'API Amazon RDS Data. Le module est importé à l'aide de `@aws-appsync/utils/rds` : 

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

Les fonctions peuvent également être importées individuellement. Par exemple, l'importation ci-dessous utilise `sql` :

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

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

Vous pouvez utiliser les aides utilitaires du module AWS AppSync RDS pour interagir avec votre base de données.

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

L'`select`utilitaire crée une `SELECT` instruction pour interroger votre base de données relationnelle. 

**Usage de base**

Dans sa forme de base, vous pouvez spécifier la table que vous souhaitez interroger :

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

export function request(ctx) {

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

Notez que vous pouvez également spécifier le schéma dans l'identifiant de votre table :

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

export function request(ctx) {

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

**Spécification des colonnes**

Vous pouvez définir des colonnes à l'aide de `columns` cette propriété. S'il n'est pas défini sur une valeur, la valeur par défaut est : `*`

```
export function request(ctx) {

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

Vous pouvez également spécifier le tableau d'une colonne :

```
export function request(ctx) {

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

**Limites et compensations**

Vous pouvez appliquer `limit` et répondre `offset` à la requête :

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

**Commander par**

Vous pouvez trier vos résultats à l'aide de `orderBy` cette propriété. Fournissez un tableau d'objets spécifiant la colonne et une `dir` propriété facultative :

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

**Filtres**

Vous pouvez créer des filtres à l'aide de l'objet de condition spéciale :

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

Vous pouvez également combiner des filtres :

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

Vous pouvez également créer des `OR` déclarations :

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

Vous pouvez également annuler une condition avec `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 } }
        ]}
    }));
}
```

Vous pouvez également utiliser les opérateurs suivants pour comparer des valeurs :


| 
| 
| Opérateur | Description | Types de valeurs possibles | 
| --- |--- |--- |
| eq | Égal à | nombre, chaîne, booléen | 
| ne | Non égal à | nombre, chaîne, booléen | 
| le | Inférieur ou égal à | nombre, chaîne | 
| lt | Inférieur à | nombre, chaîne | 
| gm | Supérieur ou égal à | nombre, chaîne | 
| gt | Supérieur à | nombre, chaîne | 
| contient | Comme | chaîne | 
| NE CONTIENT PAS | Pas comme | chaîne | 
| Commence par | Commence par le préfixe | chaîne | 
| between | Entre deux valeurs | nombre, chaîne | 
| L'attribut existe | L'attribut n'est pas nul | nombre, chaîne, booléen | 
| size | vérifie la longueur de l'élément | chaîne | 

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

L'`insert`utilitaire fournit un moyen simple d'insérer des éléments d'une seule ligne dans votre base de données avec l'`INSERT`opération.

**Insertions d'un seul article**

Pour insérer un élément, spécifiez le tableau, puis transmettez votre objet de valeurs. Les clés d'objet sont mappées aux colonnes de votre tableau. Les noms des colonnes sont automatiquement ignorés et les valeurs sont envoyées à la base de données à l'aide de la variable map :

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

**Cas d'utilisation de MySQL**

Vous pouvez combiner un `insert` suivi d'un `select` pour récupérer la ligne que vous avez insérée :

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

**Cas d'utilisation de Postgres**

Avec Postgres, vous pouvez l'utiliser [https://www.postgresql.org/docs/current/dml-returning.html](https://www.postgresql.org/docs/current/dml-returning.html)pour obtenir des données à partir de la ligne que vous avez insérée. Il accepte `*` un tableau de noms de colonnes :

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

#### Mettre à jour
<a name="built-in-rds-modules-functions-update"></a>

L'`update`utilitaire vous permet de mettre à jour les lignes existantes. Vous pouvez utiliser l'objet condition pour appliquer des modifications aux colonnes spécifiées dans toutes les lignes qui répondent à la condition. Supposons, par exemple, que nous ayons un schéma qui nous permet de réaliser cette mutation. Nous voulons mettre à jour les `name` de `Person` avec la `id` valeur de`3`, mais uniquement si nous les connaissons (`known_since`) depuis l'année `2000` :

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

Notre résolveur de mises à jour ressemble à ceci :

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

Nous pouvons ajouter une vérification à notre condition pour nous assurer que seule la ligne dont la clé primaire est `id` égale à `3` est mise à jour. De même, pour Postgres`inserts`, vous pouvez utiliser `returning` pour renvoyer les données modifiées. 

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

L'`remove`utilitaire vous permet de supprimer des lignes existantes. Vous pouvez utiliser l'objet de condition sur toutes les lignes qui répondent à la condition. Notez qu'il `delete` s'agit d'un mot clé réservé dans JavaScript. `remove`doit être utilisé à la place :

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

### Forçage de type
<a name="built-in-rds-modules-casting"></a>

Dans certains cas, vous souhaiterez peut-être plus de précisions quant au type d'objet correct à utiliser dans votre déclaration. Vous pouvez utiliser les indications de type fournies pour spécifier le type de vos paramètres. AWS AppSync prend en charge les [mêmes indications de type](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html#rdsdtataservice-Type-SqlParameter-typeHint) que l'API Data. Vous pouvez convertir vos paramètres en utilisant les `typeHint` fonctions du AWS AppSync `rds` module. 

L'exemple suivant vous permet d'envoyer un tableau sous forme de valeur qui est convertie en objet JSON. Nous utilisons l'`->`opérateur pour récupérer l'élément situé `index` `2` dans le tableau JSON :

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

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

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

Le casting est également utile lors de la manipulation et de `DATE` la comparaison`TIME`, et `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)
}
```

Voici un autre exemple montrant comment envoyer la date et l'heure actuelles :

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

**Indications de type disponibles**
+ `typeHint.DATE`- Le paramètre correspondant est envoyé sous forme d'objet de `DATE` ce type à la base de données. Le format accepté est `YYYY-MM-DD`.
+ `typeHint.DECIMAL`- Le paramètre correspondant est envoyé sous forme d'objet de `DECIMAL` ce type à la base de données.
+ `typeHint.JSON`- Le paramètre correspondant est envoyé sous forme d'objet de `JSON` ce type à la base de données.
+ `typeHint.TIME`- La valeur de paramètre de chaîne correspondante est envoyée sous forme d'objet de `TIME` ce type à la base de données. Le format accepté est `HH:MM:SS[.FFF]`. 
+ `typeHint.TIMESTAMP`- La valeur de paramètre de chaîne correspondante est envoyée sous forme d'objet de `TIMESTAMP` ce type à la base de données. Le format accepté est `YYYY-MM-DD HH:MM:SS[.FFF]`.
+ `typeHint.UUID`- La valeur de paramètre de chaîne correspondante est envoyée sous forme d'objet de `UUID` ce type à la base de données.

# utilitaires d'exécution
<a name="runtime-utils-js"></a>

La `runtime` bibliothèque fournit des utilitaires permettant de contrôler ou de modifier les propriétés d'exécution de vos résolveurs et fonctions.

## Liste des utilitaires d'exécution
<a name="runtime-utils-list-js"></a>

 **`runtime.earlyReturn(obj?: unknown, returnOptions?: {skipTo: 'END' | 'NEXT'}): never`**  
L'invocation de cette fonction interrompt l'exécution du gestionnaire, de la AWS AppSync fonction ou du résolveur actuel (Unit ou Pipeline Resolver) en fonction du contexte actuel. L'objet spécifié est renvoyé en tant que résultat.  
+ Lorsqu'il est appelé dans un gestionnaire de demande de AWS AppSync fonction, la source de données et le gestionnaire de réponse sont ignorés, et le gestionnaire de demande de fonction suivant (ou le gestionnaire de réponse du résolveur de pipeline s'il s'agit de la dernière fonction) est appelé. AWS AppSync 
+ Lorsqu'il est appelé dans un gestionnaire de demandes de résolution de AWS AppSync pipeline, l'exécution du pipeline est ignorée et le gestionnaire de réponse du résolveur de pipeline est appelé immédiatement.
+ Lorsqu'il `returnOptions` est `skipTo` défini sur « END », l'exécution du pipeline est ignorée et le gestionnaire de réponse du résolveur de pipeline est appelé immédiatement.
+ Lorsqu'il `returnOptions` est `skipTo` défini sur « NEXT », l'exécution de la fonction est ignorée et le gestionnaire de pipeline suivant est appelé.
**Exemple**  

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

# Des aides temporelles dans util.time
<a name="time-helpers-in-util-time-js"></a>

La variable `util.time` contient les méthodes datetime pour aider à générer les horodatages, à convertir d'un format datetime à l'autre et à analyser les chaînes datetime. La syntaxe des formats datetime est basée sur [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)laquelle vous pouvez vous référer pour obtenir de la documentation supplémentaire.

## Liste des heures et des outils
<a name="utility-helpers-in-time-list-js"></a>

 **`util.time.nowISO8601()`**  
Renvoie une représentation sous forme de chaîne de l'UTC au [ISO8601format](https://en.wikipedia.org/wiki/ISO_8601).

 **`util.time.nowEpochSeconds()`**  
Renvoie le nombre de secondes entre l'époque Unix 1970-01-01T00:00:00Z et maintenant.

 **`util.time.nowEpochMilliSeconds()`**  
Renvoie le nombre de millisecondes entre l'époque Unix 1970-01-01T00:00:00Z et maintenant.

 **`util.time.nowFormatted(String)`**  
Renvoie une chaîne de l'horodatage actuel (UTC) à l'aide du format spécifié à partir d'un type d'entrée String (chaîne).

 **`util.time.nowFormatted(String, String)`**  
Renvoie une chaîne de l'horodatage actuel pour un fuseau horaire à l'aide du format et du fuseau spécifiés à partir de types d'entrée String (chaîne).

 **`util.time.parseFormattedToEpochMilliSeconds(String, String)`**  
Analyse un horodatage transmis sous forme de chaîne avec un format contenant un fuseau horaire, puis renvoie l'horodatage en millisecondes depuis l'époque.

 **`util.time.parseFormattedToEpochMilliSeconds(String, String, String)`**  
Analyse un horodatage transmis sous forme de chaîne avec un format et un fuseau horaire, puis renvoie l'horodatage en millisecondes depuis l'époque.

 **`util.time.parseISO8601ToEpochMilliSeconds(String)`**  
Analyse un ISO8601 horodatage transmis sous forme de chaîne, puis renvoie l'horodatage en millisecondes depuis l'époque.

 **`util.time.epochMilliSecondsToSeconds(long)`**  
Convertit une époque Unix en millisecondes en une époque Unix en secondes.

 **`util.time.epochMilliSecondsToISO8601(long)`**  
Convertit l'horodatage d'une époque en millisecondes en horodatage. ISO8601

 **`util.time.epochMilliSecondsToFormatted(long, String)`**  
Convertit l'horodatage d'une époque en millisecondes, transmis sous sa forme la plus longue, en un horodatage formaté selon le format fourni en UTC.

 **`util.time.epochMilliSecondsToFormatted(long, String, String)`**  
Convertit un horodatage en millisecondes d'époque, transmis sous forme de long, en un horodatage formaté selon le format fourni dans le fuseau horaire fourni.

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

`util.dynamodb`contient des méthodes d'assistance qui facilitent l'écriture et la lecture de données dans Amazon DynamoDB, telles que le mappage automatique des types et le formatage. 

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

### Liste des utilitaires de ToDynamoDB
<a name="utility-helpers-in-toDynamoDB-list-js"></a>

 **`util.dynamodb.toDynamoDB(Object)`**   
Outil général de conversion d'objets pour DynamoDB qui convertit les objets d'entrée en une représentation DynamoDB appropriée. La façon dont il représente certains types est clairement arrêtée : par exemple, il utilise les listes (« L ») plutôt que les ensembles (« SS », « NS », « BS »). Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  
**Exemple de chaîne**  

```
Input:      util.dynamodb.toDynamoDB("foo")
Output:     { "S" : "foo" }
```
**Exemple de numéro**  

```
Input:      util.dynamodb.toDynamoDB(12345)
Output:     { "N" : 12345 }
```
**Exemple booléen**  

```
Input:      util.dynamodb.toDynamoDB(true)
Output:     { "BOOL" : true }
```
**Exemple de liste**  

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

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

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

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

**`util.dynamodb.toString(String)`**  
Convertit une chaîne d'entrée au format de chaîne DynamoDB. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

 **`util.dynamodb.toStringSet(List<String>)`**  
Convertit une liste contenant des chaînes au format de jeu de chaînes DynamoDB. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

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

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

 **`util.dynamodb.toNumber(Number)`**  
Convertit un nombre au format numérique DynamoDB. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

 **`util.dynamodb.toNumberSet(List<Number>)`**  
Convertit une liste de nombres au format d'ensemble de numéros DynamoDB. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

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

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

 **`util.dynamodb.toBinary(String)`**  
Convertit les données binaires codées sous forme de chaîne base64 au format binaire DynamoDB. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

 **`util.dynamodb.toBinarySet(List<String>)`**  
Convertit une liste de données binaires codées sous forme de chaînes base64 au format d'ensemble binaire DynamoDB. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

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

### Liste des utilitaires ToBoolean
<a name="utility-helpers-in-toBoolean-list-js"></a>

 **`util.dynamodb.toBoolean(Boolean)`**  
Convertit un booléen au format booléen DynamoDB approprié. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

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

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

 **`util.dynamodb.toNull()`**  
Renvoie une valeur nulle au format DynamoDB nul. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

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

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

**`util.dynamodb.toList(List)`**  
Convertit une liste d'objets au format de liste DynamoDB. Chaque élément de la liste est également converti au format DynamoDB approprié. La façon dont il représente certains objets imbriqués est clairement arrêtée : par exemple, il utilise les listes (« L ») plutôt que les ensembles (« SS », « NS », « BS »). Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

## Utilitaires TomaP
<a name="utility-helpers-in-toMap-js"></a>

### Liste des utilitaires de TomaP
<a name="utility-helpers-in-toMap-list-js"></a>

 **`util.dynamodb.toMap(Map)`**  
Convertit une carte au format de carte DynamoDB. Chaque valeur de la carte est également convertie au format DynamoDB approprié. La façon dont il représente certains objets imbriqués est clairement arrêtée : par exemple, il utilise les listes (« L ») plutôt que les ensembles (« SS », « NS », « BS »). Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

 **`util.dynamodb.toMapValues(Map)`**  
Crée une copie de la carte où chaque valeur a été convertie au format DynamoDB approprié. La façon dont il représente certains objets imbriqués est clairement arrêtée : par exemple, il utilise les listes (« L ») plutôt que les ensembles (« SS », « NS », « BS »).  

```
Input:      util.dynamodb.toMapValues({ "foo": "bar", "baz" : 1234, "beep": [ "boop"] })
Output:     {
               "foo"  : { "S" : "bar" },
               "baz"  : { "N" : 1234 },
               "beep" : {
                   "L" : [
                       { "S" : "boop" }
                   ]
               }
           }
```
Cela est légèrement différent `util.dynamodb.toMap(Map)` car il renvoie uniquement le contenu de la valeur d'attribut DynamoDB, mais pas la valeur d'attribut complète elle-même. Par exemple, les instructions suivantes sont exactement identiques :  

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

## Utilitaires de l'objet S3
<a name="utility-helpers-in-S3Object-js"></a>

### Liste des utilitaires de S3Object
<a name="utility-helpers-in-S3Object-list-js"></a>

**`util.dynamodb.toS3Object(String key, String bucket, String region)`**  
Convertit la clé, le compartiment et la région en représentation de l'objet DynamoDB S3. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

**`util.dynamodb.toS3Object(String key, String bucket, String region, String version)`**  
Convertit la clé, le compartiment, la région et la version facultative en représentation de l'objet DynamoDB S3. Cela renvoie un objet qui décrit la valeur de l'attribut DynamoDB.  

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

 **`util.dynamodb.fromS3ObjectJson(String)`**  
Accepte la valeur de chaîne d'un objet DynamoDB S3 et renvoie une carte contenant la clé, le compartiment, la région et la version facultative.  

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

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

L'`util.http`utilitaire fournit des méthodes d'assistance que vous pouvez utiliser pour gérer les paramètres des requêtes HTTP et pour ajouter des en-têtes de réponse.

## liste d'utilitaires util.http
<a name="http-helpers-in-utils-http-list-js"></a>

 **`util.http.copyHeaders(headers)`**  
Copie les en-têtes de la carte, à l'exception des en-têtes HTTP restreints suivants :  
+ transfer-encoding
+ connection
+ host
+ expect
+ keep-alive
+ upgrade
+ proxy-authenticate
+ proxy-authorization
+ te
+ content-length

**`util.http.addResponseHeader(String, Object)`**  
Ajoute un seul en-tête personnalisé avec le nom (`String`) et la valeur (`Object`) de la réponse. Les limites suivantes s'appliquent :  
+ Outre la liste des en-têtes restreints pour`copyHeaders(headers)`, les noms d'en-têtes ne peuvent correspondre à aucun des éléments suivants :
  + 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
+ Les noms d'en-tête ne peuvent pas commencer par les préfixes restreints `x-amzn-` ou`x-amz-`.
+ La taille des en-têtes de réponse personnalisés ne peut pas dépasser 4 Ko. Cela inclut les noms et les valeurs des en-têtes.
+ Vous devez définir chaque en-tête de réponse une fois par opération GraphQL. Toutefois, si vous définissez plusieurs fois un en-tête personnalisé portant le même nom, la définition la plus récente apparaît dans la réponse. Tous les en-têtes sont pris en compte dans la limite de taille d'en-tête, quel que soit leur nom.
+ Les en-têtes dont le nom est vide ou restreint `(String)` ou dont la valeur est nulle `(Object)` seront ignorés et produiront une `ResponseHeaderError` erreur qui sera ajoutée à la `errors` sortie de l'opération.

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

**`util.http.addResponseHeaders(Map)`**  
Ajoute plusieurs en-têtes de réponse à la réponse à partir de la carte de noms `(String)` et de valeurs `(Object)` spécifiée. Les mêmes limites répertoriées pour la `addResponseHeader(String, Object)` méthode s'appliquent également à cette méthode.  

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

# Aides à la transformation dans util.transform
<a name="transformation-helpers-in-utils-transform-js"></a>

`util.transform`contient des méthodes d'assistance qui facilitent l'exécution d'opérations complexes sur des sources de données.

## Liste des outils d'aide à la transformation
<a name="transformation-helpers-in-utils-transform-js-list"></a>

**`util.transform.toDynamoDBFilterExpression(filterObject: DynamoDBFilterObject) : string`**  
Convertit une chaîne d'entrée en une expression de filtre à utiliser avec DynamoDB. Nous vous recommandons de l'utiliser `toDynamoDBFilterExpression` avec les [fonctions du module intégré](https://docs.aws.amazon.com/appsync/latest/devguide/built-in-modules-js.html).

**`util.transform.toElasticsearchQueryDSL(object: OpenSearchQueryObject) : string`**  
Convertit l'entrée donnée en son expression OpenSearch Query DSL équivalente, en la renvoyant sous forme de chaîne JSON.  
**Exemple de saisie :**  

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

```
{
    "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"
                    }
                  }
              ]
            }
          }
      ]
    }
}
```
L'opérateur par défaut est supposé être AND.

**`util.transform.toSubscriptionFilter(objFilter, ignoredFields?, rules?): SubscriptionFilter`**  
Convertit un objet `Map` d'entrée en objet d'`SubscriptionFilter`expression. La `util.transform.toSubscriptionFilter` méthode est utilisée comme entrée dans l'`extensions.setSubscriptionFilter()`extension. Pour plus d'informations, consultez la section [Extensions](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html).  
Les paramètres et l'instruction de retour sont répertoriés ci-dessous :  
*Paramètres*  
+ `objFilter`: `SubscriptionFilterObject`

  Objet d'`Map`entrée converti en objet d'`SubscriptionFilter`expression.
+ `ignoredFields`: `SubscriptionFilterExcludeKeysType` (facultatif)

  A `List` des noms de champs du premier objet qui seront ignorés.
+ `rules`: `SubscriptionFilterRuleObject` (facultatif)

  Un objet `Map` d'entrée avec des règles strictes qui est inclus lors de la construction de l'objet `SubscriptionFilter` d'expression. Ces règles strictes seront incluses dans l'objet `SubscriptionFilter` d'expression afin qu'au moins l'une des règles soit satisfaite pour passer le filtre d'abonnement.
*Réponse*  
Retourne un `[SubscriptionFilter](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html)`.

**`util.transform.toSubscriptionFilter(Map, List)`**  
Convertit un objet `Map` d'entrée en objet d'`SubscriptionFilter`expression. La `util.transform.toSubscriptionFilter` méthode est utilisée comme entrée dans l'`extensions.setSubscriptionFilter()`extension. Pour plus d'informations, consultez la section [Extensions](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html).  
Le premier argument est l'objet `Map` d'entrée converti en objet d'`SubscriptionFilter`expression. Le deuxième argument est un nom `List` de champ qui est ignoré dans le premier objet `Map` d'entrée lors de la construction de l'objet `SubscriptionFilter` d'expression.

**`util.transform.toSubscriptionFilter(Map, List, Map)`**  
Convertit un objet `Map` d'entrée en objet d'`SubscriptionFilter`expression. La `util.transform.toSubscriptionFilter` méthode est utilisée comme entrée dans l'`extensions.setSubscriptionFilter()`extension. Pour plus d'informations, consultez la section [Extensions](https://docs.aws.amazon.com/appsync/latest/devguide/extensions-js.html). 

**`util.transform.toDynamoDBConditionExpression(conditionObject)`**  
Crée une expression de condition DynamoDB.

## Arguments du filtre d'abonnement
<a name="subscription-filter-arguments-js"></a>

Le tableau suivant explique comment les arguments des utilitaires suivants sont définis :
+ `Util.transform.toSubscriptionFilter(objFilter, ignoredFields?, rules?): SubscriptionFilter`

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

L'argument 1 est un `Map` objet dont les valeurs clés sont les suivantes :
+ noms de champs
+ « et »
+ « ou »

Pour les noms de champs sous forme de clés, les conditions relatives aux entrées de ces champs sont sous la forme de`"operator" : "value"`. 

L'exemple suivant montre comment ajouter des entrées au `Map` :

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

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

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

Lorsqu'un champ comporte au moins deux conditions, toutes ces conditions sont considérées comme utilisant l'opération OR.

L'entrée `Map` peut également comporter des touches « et » et « ou », ce qui implique que toutes les entrées qu'elles contiennent doivent être jointes en utilisant la logique ET ou ou selon la clé. Les valeurs clés « et » et « ou » supposent un ensemble de conditions.

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

Notez que vous pouvez imbriquer « et » et « ou ». C'est-à-dire que vous pouvez avoir imbriqué « et » /"ou » dans un autre bloc « et » /"ou ». Toutefois, cela ne fonctionne pas pour les champs simples.

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

L'exemple suivant montre une entrée de l'*argument 1* utilisant`util.transform.toSubscriptionFilter(Map) : Map`.

**Entrée (s)**

Argument 1 : Carte :

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

**Sortie**

Le résultat est un `Map` objet :

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

L'argument 2 contient des noms `List` de champs qui ne doivent pas être pris en compte dans l'entrée `Map` (argument 1) lors de la construction de l'objet `SubscriptionFilter` d'expression. Ils `List` peuvent également être vides.

L'exemple suivant montre les entrées de l'argument 1 et de l'argument 2 en utilisant`util.transform.toSubscriptionFilter(Map, List) : Map`.

**Entrée (s)**

Argument 1 : Carte :

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

Argument 2 : Liste :

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

**Sortie**

Le résultat est un `Map` objet :

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

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

L'argument 3 est un `Map` objet dont les noms de champs sont des valeurs clés (il ne peut pas y avoir « et » ou « ou »). Pour les noms de champs sous forme de clés, les conditions relatives à ces champs sont des entrées sous la forme de`"operator" : "value"`. Contrairement à l'argument 1, l'argument 3 ne peut pas avoir plusieurs conditions dans la même clé. De plus, l'argument 3 ne contient pas de clause « et » ou « ou », il n'y a donc aucune imbrication non plus.

L'argument 3 représente une liste de règles strictes, qui sont ajoutées à l'objet `SubscriptionFilter` d'expression afin qu'**au moins l'une** de ces conditions soit remplie pour passer le filtre.

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

L'exemple suivant montre les entrées des *arguments 1*, *2* et *3* en utilisant`util.transform.toSubscriptionFilter(Map, List, Map) : Map`.

**Entrée (s)**

Argument 1 : Carte :

```
{
  "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 : Carte :

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

**Sortie**

Le résultat est un `Map` objet :

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

------

# assistants de chaîne dans util.str
<a name="str-helpers-in-util-str-js"></a>

 `util.str`contient des méthodes pour faciliter les opérations courantes sur les chaînes de caractères. 

## liste des utilitaires de util.str
<a name="str-helpers-in-util-str-list-js"></a>

 **`util.str.normalize(String, String)`**  
Normalise une chaîne en utilisant l'une des quatre formes de normalisation Unicode : NFC, NFD, NFKC ou NFKD. Le premier argument est la chaîne à normaliser. Le deuxième argument est « nfc », « nfd », « nfkc » ou « nfkd », spécifiant le type de normalisation à utiliser pour le processus de normalisation.

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

`extensions`contient un ensemble de méthodes permettant d'effectuer des actions supplémentaires dans vos résolveurs.

## Extensions de mise en cache
<a name="caching-extensions-js-list"></a>

**`extensions.evictFromApiCache(typeName: string, fieldName: string, keyValuePair: Record<string, any>) : Object`**  
Élimine un élément du cache AWS AppSync côté serveur. Le premier argument est le nom du type. Le deuxième argument est le nom du champ. Le troisième argument est un objet contenant des éléments de paire clé-valeur qui spécifient la valeur de la clé de mise en cache. Vous devez placer les éléments dans l'objet dans le même ordre que les clés de mise en cache dans le résolveur mis en cache. `cachingKey` Pour plus d'informations sur la mise en cache, consultez la section Comportement de [mise en cache.](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html#caching-behavior)  
**Exemple 1 :**  
Cet exemple évacue les éléments mis en cache pour un résolveur appelé `Query.allClasses` sur lequel une clé de mise en cache appelée a été utilisée. `context.arguments.semester` Lorsque la mutation est appelée et que le résolveur s'exécute, si une entrée est correctement effacée, la réponse contient une `apiCacheEntriesDeleted` valeur dans l'objet extensions qui indique le nombre d'entrées supprimées.  

```
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;
}
```
Cette fonction **ne fonctionne que** pour les mutations, pas pour les requêtes.

## Extensions d'abonnement
<a name="subscription-extensions-js-list"></a>

**`extensions.setSubscriptionFilter(filterJsonObject)`**  
Définit des filtres d'abonnement améliorés. Chaque événement de notification d'abonnement est évalué par rapport aux filtres d'abonnement fournis et envoie des notifications aux clients si tous les filtres sont conformes`true`. L'argument est `filterJsonObject` (Vous trouverez plus d'informations sur cet argument ci-dessous dans la filterJsonObject section *Argument :*). Consultez la section [Filtrage amélioré des abonnements](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html).  
Vous pouvez utiliser cette fonction d'extension uniquement dans le gestionnaire de réponses d'un résolveur d'abonnement. Nous vous recommandons également de l'utiliser `util.transform.toSubscriptionFilter` pour créer votre filtre.

**`extensions.setSubscriptionInvalidationFilter(filterJsonObject)`**  
Définit les filtres d'invalidation des abonnements. Les filtres d'abonnement sont évalués par rapport à la charge utile d'invalidation, puis invalident un abonnement donné s'ils sont évalués à. `true` L'argument est `filterJsonObject` (Vous trouverez plus d'informations sur cet argument ci-dessous dans la filterJsonObject section *Argument :*). Consultez la section [Filtrage amélioré des abonnements](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html).  
Vous pouvez utiliser cette fonction d'extension uniquement dans le gestionnaire de réponses d'un résolveur d'abonnement. Nous vous recommandons également de l'utiliser `util.transform.toSubscriptionFilter` pour créer votre filtre.

**`extensions.invalidateSubscriptions(invalidationJsonObject)`**  
Utilisé pour initier l'invalidation d'un abonnement suite à une mutation. L'argument est `invalidationJsonObject` (Vous trouverez plus d'informations sur cet argument ci-dessous dans la invalidationJsonObject section *Argument :*).  
Cette extension ne peut être utilisée que dans les modèles de mappage des réponses des résolveurs de mutations.  
Vous ne pouvez utiliser qu'au maximum cinq appels de `extensions.invalidateSubscriptions()` méthode uniques par requête. Si vous dépassez cette limite, vous recevrez une erreur GraphQL.

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

L'objet JSON définit des filtres d'abonnement ou d'invalidation. Il s'agit d'un ensemble de filtres dans un`filterGroup`. Chaque filtre est un ensemble de filtres individuels.

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

Chaque filtre possède trois attributs : 
+ `fieldName`— Le champ du schéma GraphQL.
+ `operator`— Le type d'opérateur.
+ `value`— Les valeurs à comparer à la `fieldName` valeur de la notification d'abonnement.

Voici un exemple d'attribution de ces attributs :

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

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

`invalidationJsonObject`définit les éléments suivants :
+ `subscriptionField`— L'abonnement au schéma GraphQL à invalider. Un seul abonnement, défini comme une chaîne dans le`subscriptionField`, est considéré comme invalide.
+ `payload`— Une liste de paires clé-valeur utilisée comme entrée pour invalider les abonnements si le filtre d'invalidation est évalué par rapport à leurs valeurs. `true`

  L'exemple suivant invalide les clients abonnés et connectés utilisant l'`onUserDelete`abonnement lorsque le filtre d'invalidation défini dans le résolveur d'abonnement est évalué par rapport à la valeur. `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;
  }
  ```

# Assistants XML dans le fichier util.xml
<a name="xml-helpers-in-util-xml-js"></a>

 `util.xml`contient des méthodes pour faciliter la conversion de chaînes XML. 

## Liste des utilitaires du fichier util.xml
<a name="xml-helpers-in-util-xml-list-js"></a>

 **`util.xml.toMap(String) : Object`**  
Convertit une chaîne XML en dictionnaire.  
**Exemple 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"
      }
    }
}
```
**Exemple 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`**  
Convertit une chaîne XML en chaîne JSON. Ceci est similaire à`toMap`, sauf que la sortie est une chaîne. Cela est utile si vous souhaitez convertir et renvoyer directement la réponse XML à partir d'un objet HTTP vers JSON. Vous pouvez définir un paramètre booléen facultatif pour déterminer si vous souhaitez coder le JSON en chaîne.

# AWS AppSync JavaScript référence de fonction de résolution pour DynamoDB
<a name="js-resolver-reference-dynamodb"></a>

La fonction AWS AppSync DynamoDB vous permet d'utiliser [GraphQL](https://graphql.org) pour stocker et récupérer des données dans des tables Amazon DynamoDB existantes de votre compte en mappant une requête GraphQL entrante dans un appel DynamoDB, puis en mappant la réponse DynamoDB à GraphQL. Cette section décrit les gestionnaires de demandes et de réponses pour les opérations DynamoDB prises en charge :
+  [GetItem](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-getitem.html)- La GetItem demande vous permet de demander à la fonction DynamoDB d'envoyer une GetItem demande à DynamoDB, de spécifier la clé de l'élément dans DynamoDB et d'utiliser une lecture cohérente ou non.
+  [ PutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-putitem.html)- Le document de mappage des demandes vous permet de PutItem demander à la fonction DynamoDB d'envoyer une PutItem demande à DynamoDB et de spécifier la clé de l'élément dans DynamoDB, le contenu complet de l'élément (composé de clés et de valeurs d'attribut) et les conditions de réussite de l'opération.
+  [ UpdateItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-updateitem.html)- La UpdateItem demande vous permet de demander à la fonction DynamoDB d'envoyer une UpdateItem demande à DynamoDB et de spécifier la clé de l'élément dans DynamoDB, une expression de mise à jour décrivant comment mettre à jour l'élément dans DynamoDB et les conditions de réussite de l'opération.
+  [ DeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-deleteitem.html)- La DeleteItem demande vous permet de demander à la fonction DynamoDB d'envoyer une DeleteItem demande à DynamoDB, de spécifier la clé de l'élément dans DynamoDB et les conditions de réussite de l'opération.
+  [Requête](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-query.html) : l'objet de demande Query vous permet de demander au résolveur DynamoDB d'envoyer une demande de requête à DynamoDB et de spécifier l'expression clé, l'index à utiliser, les filtres supplémentaires, le nombre d'éléments à renvoyer, l'utilisation de lectures cohérentes, le sens de la requête (avant ou arrière) et les jetons de pagination.
+  [Scan](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-scan.html) : la demande Scan vous permet de demander à la fonction DynamoDB d'envoyer une demande de scan à DynamoDB et de spécifier un filtre pour exclure les résultats, l'index à utiliser, le nombre d'éléments à renvoyer, l'opportunité d'utiliser des lectures cohérentes, des jetons de pagination et des scans parallèles.
+  [Synchronisation](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-sync.html) : l'objet de demande de synchronisation vous permet de récupérer tous les résultats d'une table DynamoDB, puis de ne recevoir que les données modifiées depuis votre dernière requête (le delta est mis à jour). Les demandes de synchronisation ne peuvent être effectuées que vers des sources de données DynamoDB versionnées. Vous pouvez spécifier un filtre pour exclure les résultats, le nombre d'éléments à renvoyer, les jetons de pagination et la date de début de votre dernière opération de synchronisation.
+  [ BatchGetItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-get-item.html)- L'objet de BatchGetItem requête vous permet de demander à la fonction DynamoDB d'envoyer une BatchGetItem demande à DynamoDB pour récupérer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de requête, vous devez spécifier les noms des tables à partir desquelles récupérer les éléments et les clés des éléments à récupérer dans chaque table.
+  [ BatchDeleteItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-delete-item.html)- L'objet de BatchDeleteItem requête vous permet de demander à la fonction DynamoDB de BatchWriteItem demander à DynamoDB de supprimer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de requête, vous devez spécifier les noms des tables dont vous souhaitez supprimer les éléments et les clés des éléments à supprimer de chaque table.
+  [ BatchPutItem ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-batch-put-item.html)- L'objet de BatchPutItem requête vous permet de demander à la fonction DynamoDB d'envoyer une BatchWriteItem demande à DynamoDB pour placer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de requête, vous devez spécifier les noms des tables dans lesquelles placer les éléments et les éléments complets à placer dans chaque table.
+  [ TransactGetItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-get-items.html)- L'objet de TransactGetItems requête vous permet de demander à la fonction DynamoDB d'envoyer une TransactGetItems demande à DynamoDB pour récupérer plusieurs éléments, potentiellement sur plusieurs tables. Pour cet objet de demande, vous devez spécifier le nom de table de chaque élément de demande à partir duquel l'élément doit être extrait et la clé de chaque élément de demande à extraire de chaque table.
+  [ TransactWriteItems ](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transact-write-items.html)- L'objet de TransactWriteItems requête vous permet de demander à la fonction DynamoDB de TransactWriteItems demander à DynamoDB d'écrire plusieurs éléments, éventuellement dans plusieurs tables. Pour cet objet de demande, vous devez spécifier le nom de table de destination de chaque élément de demande, l'opération de chaque élément de demande à effectuer et la clé de chaque élément de demande à écrire.
+  [Système de types (mappage des demandes)](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-typed-values-request.html) : découvrez comment la saisie DynamoDB est intégrée aux demandes. AWS AppSync 
+  [Système de types (mappage des réponses)](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-typed-values-responses.html) : découvrez comment les types DynamoDB sont automatiquement convertis en GraphQL ou JSON dans une charge utile de réponse.
+  [Filtres](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-filter.html) - En savoir plus sur les filtres pour les opérations de recherche et de numérisation.
+  [Expressions de condition](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-condition-expressions.html) : en savoir plus sur les expressions de condition pour PutItem UpdateItem, et les DeleteItem opérations.
+  [Expressions de conditions de transaction](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions.html) - En savoir plus sur les expressions de conditions pour les TransactWriteItems opérations.
+  [Projections](https://docs.aws.amazon.com/appsync/latest/devguide/js-aws-appsync-resolver-reference-dynamodb-projections.html) - Découvrez comment spécifier des attributs dans les opérations de lecture.

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

La `GetItem` demande vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer `GetItem` une demande à DynamoDB et de spécifier :
+ La clé de l'élément dans DynamoDB
+ S'il convient d'utiliser une lecture cohérente ou non

La structure de la `GetItem` demande est la suivante :

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

Les champs sont définis comme suit :

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

### GetItem liste des champs
<a name="js-getitem-list-col"></a>

 **`operation`**   
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `GetItem`, ce champ doit être défini sur `GetItem`. Cette valeur est obligatoire.

 **`key`**   
La clé de l'élément dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.

 **`consistentRead`**   
S'il faut ou non effectuer une lecture très cohérente avec DynamoDB. Ce champ est facultatif et `false` est la valeur définie par défaut.

**`projection`**  
Projection utilisée pour spécifier les attributs à renvoyer par l'opération DynamoDB. Pour plus d'informations sur les projections, voir [Projections](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Ce champ est facultatif.

L'élément renvoyé par DynamoDB est automatiquement converti en types primitifs GraphQL et JSON, et est disponible dans le résultat du contexte (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScript résolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

L'exemple suivant est un gestionnaire de demande de fonction pour une requête `getThing(foo: String!, bar: String!)` GraphQL :

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

Pour de plus amples informations sur l'API de DynamoDB `GetItem`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html).

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

Le document de mappage des demandes vous permet de `PutItem` demander à la fonction AWS AppSync DynamoDB d'envoyer `PutItem` une demande à DynamoDB et de spécifier les éléments suivants :
+ La clé de l'élément dans DynamoDB
+ Contenu complet de l'élément (composé de `key` et de `attributeValues`)
+ Conditions de réussite de l'opération

La structure de la `PutItem` demande est la suivante :

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

Les champs sont définis comme suit :

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

### PutItem liste des champs
<a name="js-putitem-list-col"></a>

 **`operation`**   
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `PutItem`, ce champ doit être défini sur `PutItem`. Cette valeur est obligatoire.

 **`key`**   
La clé de l'élément dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.

 **`attributeValues`**   
Le reste des attributs de l'élément doit être placé dans DynamoDB. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Ce champ est facultatif.

 **`condition`**   
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `PutItem` remplace toute entrée existante pour cet élément. Pour plus d'informations sur les conditions, consultez la section [Expressions de condition](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Cette valeur est facultative.

 **`_version`**   
Valeur numérique représentant la dernière version connue d'un élément. Cette valeur est facultative. Ce champ est utilisé pour la *détection de conflits* et n'est pris en charge que sur les sources de données versionnées.

**`customPartitionKey`**  
Lorsqu'elle est activée, cette valeur de chaîne modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le contrôle des versions a été activé (pour plus d'informations, voir [Détection des conflits et synchronisation](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *guide du AWS AppSync développeur*). Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. Ce champ est facultatif.

**`populateIndexFields`**  
Valeur booléenne qui, lorsqu'elle est activée en **même temps que le `customPartitionKey`**, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`gsi_ds_sk`. Pour plus d'informations, consultez la section [Détection et synchronisation des conflits](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *manuel du AWS AppSync développeur*. Ce champ est facultatif.   
L'élément écrit dans DynamoDB est automatiquement converti en types primitifs GraphQL et JSON et est disponible dans le résultat du contexte (). `context.result`

L'élément écrit dans DynamoDB est automatiquement converti en types primitifs GraphQL et JSON et est disponible dans le résultat du contexte (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScriptrésolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

L'exemple suivant est un gestionnaire de demande de fonction pour une mutation `updateThing(foo: String!, bar: String!, name: String!, version: Int!)` GraphQL.

S'il n'existe aucun élément avec la clé spécifiée, il est créé. S'il existe déjà un élément avec la clé spécifiée, il est remplacé.

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

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

L'exemple suivant est un gestionnaire de demande de fonction pour une mutation `updateThing(foo: String!, bar: String!, name: String!, expectedVersion: Int!)` GraphQL.

Cet exemple vérifie que le champ de l'élément actuellement dans DynamoDB est `version` défini sur. `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,
  };
}
```

Pour de plus amples informations sur l'API de DynamoDB `PutItem`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html).

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

La `UpdateItem` demande vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer une `UpdateItem` demande à DynamoDB et de spécifier les éléments suivants :
+ La clé de l'élément dans DynamoDB
+ Expression de mise à jour décrivant comment mettre à jour l'élément dans DynamoDB
+ Conditions de réussite de l'opération

La structure de la `UpdateItem` demande est la suivante :

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

Les champs sont définis comme suit :

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

### UpdateItem liste des champs
<a name="js-updateitem-list-col"></a>

 **`operation`**   
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `UpdateItem`, ce champ doit être défini sur `UpdateItem`. Cette valeur est obligatoire.

 **`key`**   
La clé de l'élément dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la spécification d'une « valeur saisie », consultez [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.

 **`update`**   
La `update` section vous permet de spécifier une expression de mise à jour qui décrit comment mettre à jour l'élément dans DynamoDB. Pour plus d'informations sur l'écriture d'expressions de mise à jour, consultez la documentation [ UpdateExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Cette section est obligatoire.  
La section `update` possède trois composants :    
** `expression` **  
Expression de mise à jour. Cette valeur est obligatoire.  
** `expressionNames` **  
Substituts des espaces réservés de *nom* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé utilisé dans le`expression`, et la valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de nom des attributs de l'expression utilisés dans l'`expression`.  
** `expressionValues` **  
Substituts des espaces réservés de *valeur* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de valeur utilisé dans l'`expression`, et la valeur doit être typée. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cela doit être spécifié. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de valeur des attributs de l'expression utilisés dans l'`expression`.

 **`condition`**   
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `UpdateItem` met à jour l'entrée existante quel que soit son état actuel. Pour plus d'informations sur les conditions, consultez la section [Expressions de condition](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Cette valeur est facultative.

 **`_version`**   
Valeur numérique représentant la dernière version connue d'un élément. Cette valeur est facultative. Ce champ est utilisé pour la *détection de conflits* et n'est pris en charge que sur les sources de données versionnées.

**`customPartitionKey`**  
Lorsqu'elle est activée, cette valeur de chaîne modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le contrôle des versions a été activé (pour plus d'informations, voir [Détection des conflits et synchronisation](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *guide du AWS AppSync développeur*). Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. Ce champ est facultatif.

**`populateIndexFields`**  
Valeur booléenne qui, lorsqu'elle est activée en **même temps que le `customPartitionKey`**, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`gsi_ds_sk`. Pour plus d'informations, consultez la section [Détection et synchronisation des conflits](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *manuel du AWS AppSync développeur*. Ce champ est facultatif.

L'élément mis à jour dans DynamoDB est automatiquement converti en types primitifs GraphQL et JSON et est disponible dans le résultat du contexte (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScript résolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

L'exemple suivant est un gestionnaire de demande de fonction pour la mutation `upvote(id: ID!)` GraphQL.

Dans cet exemple, les champs et d'un élément de DynamoDB sont `upvotes` incrémentés de `version` 1.

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

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

L'exemple suivant est un gestionnaire de demande de fonction pour une mutation `updateItem(id: ID!, title: String, author: String, expectedVersion: Int!)` GraphQL.

Il s'agit d'un exemple complexe qui inspecte les arguments et génère dynamiquement l'expression de mise à jour incluant uniquement les arguments qui ont été fournis par le client. Par exemple, si `title` et `author` sont omis, ils ne sont pas mis à jour. Si un argument est spécifié mais que sa valeur l'est`null`, ce champ est supprimé de l'objet dans DynamoDB. Enfin, l'opération comporte une condition qui vérifie si le champ de l'élément actuellement dans DynamoDB est `version` défini comme suit : `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),
    },
  };
}
```

Pour de plus amples informations sur l'API de DynamoDB `UpdateItem`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html).

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

La `DeleteItem` demande vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer une `DeleteItem` demande à DynamoDB et de spécifier les éléments suivants :
+ La clé de l'élément dans DynamoDB
+ Conditions de réussite de l'opération

La structure de la `DeleteItem` demande est la suivante :

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

Les champs sont définis comme suit :

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

### DeleteItem liste des champs
<a name="js-deleteitem-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `DeleteItem`, ce champ doit être défini sur `DeleteItem`. Cette valeur est obligatoire.

** `key` **  
La clé de l'élément dans DynamoDB. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la spécification d'une « valeur saisie », consultez [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.

** `condition` **  
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `DeleteItem` supprime un élément existant quel que soit son état actuel. Pour plus d'informations sur les conditions, consultez la section [Expressions de condition](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-condition-expressions). Cette valeur est facultative.

** `_version` **  
Valeur numérique représentant la dernière version connue d'un élément. Cette valeur est facultative. Ce champ est utilisé pour la *détection de conflits* et n'est pris en charge que sur les sources de données versionnées.

**`customPartitionKey`**  
Lorsqu'elle est activée, cette valeur de chaîne modifie le format des `ds_pk` enregistrements `ds_sk` et utilisés par la table de synchronisation delta lorsque le contrôle des versions a été activé (pour plus d'informations, voir [Détection des conflits et synchronisation](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *guide du AWS AppSync développeur*). Lorsque cette option est activée, le traitement de l'`populateIndexFields`entrée est également activé. Ce champ est facultatif.

**`populateIndexFields`**  
Valeur booléenne qui, lorsqu'elle est activée en **même temps que le `customPartitionKey`**, crée de nouvelles entrées pour chaque enregistrement de la table de synchronisation delta, en particulier dans les colonnes `gsi_ds_pk` et`gsi_ds_sk`. Pour plus d'informations, consultez la section [Détection et synchronisation des conflits](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html) dans le *manuel du AWS AppSync développeur*. Ce champ est facultatif. 

L'élément supprimé de DynamoDB est automatiquement converti en types primitifs GraphQL et JSON et est disponible dans le résultat du contexte (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScript résolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

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

L'exemple suivant est un gestionnaire de demande de fonction pour une mutation `deleteItem(id: ID!)` GraphQL. S'il existe déjà un élément avec cet ID, il est supprimé.

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

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

L'exemple suivant est un gestionnaire de demande de fonction pour une mutation `deleteItem(id: ID!, expectedVersion: Int!)` GraphQL. S'il existe déjà un élément avec cet ID, il est supprimé, mais uniquement si son champ `version` est défini sur `expectedVersion` :

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

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

Pour de plus amples informations sur l'API de DynamoDB `DeleteItem`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html).

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

L'objet de `Query` requête vous permet de demander au résolveur AWS AppSync DynamoDB d'envoyer une `Query` demande à DynamoDB et de spécifier les éléments suivants :
+ Expression de la clé
+ Quel index utiliser
+ Tout filtre supplémentaire
+ Combien d'articles renvoyer
+ S'il convient d'utiliser une lecture cohérente
+ Sens de la requête (vers l'avant ou l'arrière)
+ Jeton de pagination

La structure de l'objet de `Query` requête est la suivante :

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

Les champs sont définis comme suit :

## Champs de requête
<a name="js-query-list"></a>

### Liste des champs de requête
<a name="js-query-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `Query`, ce champ doit être défini sur `Query`. Cette valeur est obligatoire.

** `query` **  
Cette `query` section vous permet de spécifier une expression de condition clé qui décrit les éléments à récupérer depuis DynamoDB. Pour plus d'informations sur la façon d'écrire des expressions de conditions clés, consultez la documentation [ KeyConditions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html). Cette section doit être spécifiée.    
** `expression` **  
Expression de la requête. Ce champ doit être spécifié.  
** `expressionNames` **  
Substituts des espaces réservés de *nom* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé utilisé dans le`expression`, et la valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de nom des attributs de l'expression utilisés dans l'`expression`.  
** `expressionValues` **  
Substituts des espaces réservés de *valeur* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de valeur utilisé dans l'`expression`, et la valeur doit être typée. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de valeur des attributs de l'expression utilisés dans l'`expression`.

** `filter` **  
Filtre supplémentaire qui peut être utilisé pour filtrer les résultats de DynamoDB avant qu'ils soient renvoyés. Pour plus d'informations sur les filtres, consultez [Filters (Filtres)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Ce champ est facultatif.

** `index` **  
Nom de l'index à interroger. L'opération de requête DynamoDB vous permet de rechercher une clé de hachage sur les index secondaires locaux et les index secondaires globaux en plus de l'index de clé primaire. Si cela est spécifié, cela indique à DynamoDB d'interroger l'index spécifié. Si elle ne l'est pas, l'index de clé primaire est interrogé.

** `nextToken` **  
Jeton de pagination pour continuer une requête précédente. Il a été obtenu à partir d'une requête précédente. Ce champ est facultatif.

** `limit` **  
Nombre maximum d'éléments à évaluer (pas nécessairement le nombre d'éléments correspondants). Ce champ est facultatif.

** `scanIndexForward` **  
Valeur booléenne indiquant s'il convient d'interroger vers l'avant ou vers l'arrière. Ce champ est facultatif et contient `true` par défaut.

** `consistentRead` **  
Un booléen indiquant s'il faut utiliser des lectures cohérentes lors de l'interrogation de DynamoDB. Ce champ est facultatif et contient `false` par défaut.

** `select` **  
Par défaut, le résolveur AWS AppSync DynamoDB renvoie uniquement les attributs projetés dans l'index. Si un plus grand nombre d'attributs est requis, vous pouvez définir ce champ. Ce champ est facultatif. Les valeurs prises en charge sont :    
** `ALL_ATTRIBUTES` **  
Renvoie tous les attributs de l'élément depuis la table ou l'index spécifié. Si vous interrogez un index secondaire local, DynamoDB extrait l'élément entier de la table parent pour chaque élément correspondant de l'index. Si l'index est configuré de façon à projeter tous les attributs de l'élément, toutes les données peuvent être obtenues à partir de l'index secondaire local, et aucune extraction n'est nécessaire.  
** `ALL_PROJECTED_ATTRIBUTES` **  
Autorisé seulement lorsque vous interrogez un index. Extrait tous les attributs qui ont été projetés dans l'index. Si l'index est configuré de façon à projeter tous les attributs, la valeur renvoyée revient à spécifier `ALL_ATTRIBUTES`.  
**`SPECIFIC_ATTRIBUTES`**  
Renvoie uniquement les attributs répertoriés dans le `projection` « s `expression` ». Cette valeur de retour revient à spécifier les « `projection` s » `expression` sans spécifier de valeur pour`Select`.

**`projection`**  
Projection utilisée pour spécifier les attributs à renvoyer par l'opération DynamoDB. Pour plus d'informations sur les projections, voir [Projections](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Ce champ est facultatif.

Les résultats de DynamoDB sont automatiquement convertis en types primitifs GraphQL et JSON et sont disponibles dans le résultat contextuel (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScript résolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

Les résultats ont la structure suivante :

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

Les champs sont définis comme suit :

** `items` **  
Liste contenant les éléments renvoyés par la requête DynamoDB.

** `nextToken` **  
S'il peut y avoir plusieurs résultats, `nextToken` contient un jeton de pagination que vous pouvez utiliser dans une autre requête. Notez que cela AWS AppSync chiffre et masque le jeton de pagination renvoyé par DynamoDB. Cela empêche que les données provenant de votre table ne soient accidentellement communiquées au mandataire. Notez également que ces jetons de pagination ne peuvent pas être utilisés entre différentes fonctions ou résolveurs.

** `scannedCount` **  
Nombre d'éléments correspondant à l'expression de condition de requête, avant qu'une expression de filtre (si elle est présente) ne soit appliquée.

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

L'exemple suivant est un gestionnaire de demande de fonction pour une requête `getPosts(owner: ID!)` GraphQL.

Dans cet exemple, un index secondaire global sur une table est interrogé afin de renvoyer toutes les publications détenues par l'ID spécifié.

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

Pour de plus amples informations sur l'API de DynamoDB `Query`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html).

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

La `Scan` demande vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer une `Scan` demande à DynamoDB et de spécifier les éléments suivants :
+ Filtre pour exclure des résultats
+ Quel index utiliser
+ Combien d'articles renvoyer
+ S'il convient d'utiliser une lecture cohérente
+ Jeton de pagination
+ Analyses parallèles

La structure de l'objet de `Scan` requête est la suivante :

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

Les champs sont définis comme suit :

## Numériser les champs
<a name="js-scan-list"></a>

### Numériser la liste des champs
<a name="js-scan-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `Scan`, ce champ doit être défini sur `Scan`. Cette valeur est obligatoire.

** `filter` **  
Filtre qui peut être utilisé pour filtrer les résultats de DynamoDB avant qu'ils ne soient renvoyés. Pour plus d'informations sur les filtres, consultez [Filters (Filtres)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Ce champ est facultatif.

** `index` **  
Nom de l'index à interroger. L'opération de requête DynamoDB vous permet de rechercher une clé de hachage sur les index secondaires locaux et les index secondaires globaux en plus de l'index de clé primaire. Si cela est spécifié, cela indique à DynamoDB d'interroger l'index spécifié. Si elle ne l'est pas, l'index de clé primaire est interrogé.

** `limit` **  
Nombre maximal d'éléments à évaluer simultanément. Ce champ est facultatif.

** `consistentRead` **  
Un booléen qui indique s'il faut utiliser des lectures cohérentes lors de l'interrogation de DynamoDB. Ce champ est facultatif et contient `false` par défaut.

** `nextToken` **  
Jeton de pagination pour continuer une requête précédente. Il a été obtenu à partir d'une requête précédente. Ce champ est facultatif.

** `select` **  
Par défaut, la fonction AWS AppSync DynamoDB renvoie uniquement les attributs projetés dans l'index. Si un plus grand nombre d'attributs est requis, ce champ peut être défini. Ce champ est facultatif. Les valeurs prises en charge sont :    
** `ALL_ATTRIBUTES` **  
Renvoie tous les attributs de l'élément depuis la table ou l'index spécifié. Si vous interrogez un index secondaire local, DynamoDB extrait l'élément entier de la table parent pour chaque élément correspondant de l'index. Si l'index est configuré de façon à projeter tous les attributs de l'élément, toutes les données peuvent être obtenues à partir de l'index secondaire local, et aucune extraction n'est nécessaire.  
** `ALL_PROJECTED_ATTRIBUTES` **  
Autorisé seulement lorsque vous interrogez un index. Extrait tous les attributs qui ont été projetés dans l'index. Si l'index est configuré de façon à projeter tous les attributs, la valeur renvoyée revient à spécifier `ALL_ATTRIBUTES`.  
**`SPECIFIC_ATTRIBUTES`**  
Renvoie uniquement les attributs répertoriés dans le `projection` « s `expression` ». Cette valeur de retour revient à spécifier les « `projection` s » `expression` sans spécifier de valeur pour`Select`.

** `totalSegments` **  
Nombre de segments pour partitionner la table lors de l'exécution d'une analyse parallèle. Ce champ est facultatif, mais doit être spécifié si `segment` est spécifié.

** `segment` **  
Segment de table de cette opération lorsque vous effectuez une analyse parallèle. Ce champ est facultatif, mais doit être spécifié si `totalSegments` est spécifié.

**`projection`**  
Projection utilisée pour spécifier les attributs à renvoyer par l'opération DynamoDB. Pour plus d'informations sur les projections, voir [Projections](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Ce champ est facultatif.

Les résultats renvoyés par le scan DynamoDB sont automatiquement convertis en types primitifs GraphQL et JSON et sont disponibles dans le résultat contextuel (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScript résolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

Les résultats ont la structure suivante :

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

Les champs sont définis comme suit :

** `items` **  
Liste contenant les éléments renvoyés par le scan DynamoDB.

** `nextToken` **  
S'il peut y avoir plus de résultats, `nextToken` contient un jeton de pagination que vous pouvez utiliser dans une autre demande. AWS AppSync chiffre et masque le jeton de pagination renvoyé par DynamoDB. Cela empêche que les données provenant de votre table ne soient accidentellement communiquées au mandataire. De plus, ces jetons de pagination ne peuvent pas être utilisés entre différentes fonctions ou résolveurs.

** `scannedCount` **  
Nombre d'éléments récupérés par DynamoDB avant l'application d'une expression de filtre (le cas échéant).

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

L'exemple suivant est un gestionnaire de demande de fonction pour la requête GraphQL :. `allPosts`

Dans cet exemple, toutes les entrées de la table sont renvoyées.

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

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

L'exemple suivant est un gestionnaire de demande de fonction pour la requête GraphQL :. `postsMatching(title: String!)`

Dans cet exemple, toutes les entrées de la table sont renvoyées lorsque le titre commence par l'argument `title`.

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

Pour de plus amples informations sur l'API de DynamoDB `Scan`, veuillez consulter la [Documentation sur les API de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html).

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

L'objet de `Sync` requête vous permet de récupérer tous les résultats d'une table DynamoDB, puis de ne recevoir que les données modifiées depuis votre dernière requête (le delta est mis à jour). `Sync`les demandes ne peuvent être adressées qu'à des sources de données DynamoDB versionnées. Vous pouvez spécifier les éléments suivants :
+ Filtre pour exclure des résultats
+ Combien d'articles renvoyer
+ Jeton de pagination.
+ Lorsque votre dernière opération `Sync` a été lancée

La structure de l'objet de `Sync` requête est la suivante :

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

Les champs sont définis comme suit :

## Synchroniser les champs
<a name="js-sync-list"></a>

### Liste des champs de synchronisation
<a name="js-sync-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération `Sync`, ce champ doit être défini sur `Sync`. Cette valeur est obligatoire.

** `filter` **  
Filtre qui peut être utilisé pour filtrer les résultats de DynamoDB avant qu'ils ne soient renvoyés. Pour plus d'informations sur les filtres, consultez [Filters (Filtres)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-filter). Ce champ est facultatif.

** `limit` **  
Nombre maximal d'éléments à évaluer simultanément. Ce champ est facultatif. Si cette option est omise, la limite par défaut sera définie sur `100` éléments. La valeur maximale de ce champ est `1000` éléments.

** `nextToken` **  
Jeton de pagination pour continuer une requête précédente. Il a été obtenu à partir d'une requête précédente. Ce champ est facultatif.

** `lastSync` **  
Le moment, en millisecondes Epoch, où la dernière opération `Sync` réussie a commencé. Si spécifié, seuls les éléments qui ont changé après `lastSync` sont retournés. Ce champ est facultatif et ne doit être renseigné qu'après avoir récupéré toutes les pages d'une opération `Sync` initiale. Si cette option est omise, les résultats de la table *Base* seront retournés, sinon les résultats de la table *Delta* seront retournés.

**`basePartitionKey`**  
La clé de partition de la table de *base* utilisée lors de l'exécution d'une `Sync` opération. Ce champ permet d'effectuer une `Sync` opération lorsque la table utilise une clé de partition personnalisée. Il s'agit d'un champ facultatif.

**`deltaIndexName`**  
L'index utilisé pour l'`Sync`opération. Cet index est nécessaire pour permettre une `Sync` opération sur l'ensemble de la table delta store lorsque la table utilise une clé de partition personnalisée. L'`Sync`opération sera effectuée sur le GSI (créé sur `gsi_ds_pk` et`gsi_ds_sk`). Ce champ est facultatif.

Les résultats renvoyés par la synchronisation DynamoDB sont automatiquement convertis en types primitifs GraphQL et JSON et sont disponibles dans le résultat contextuel (). `context.result`

Pour plus d'informations sur la conversion de type DynamoDB, [voir Système de types (](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-responses)mappage des réponses).

Pour plus d'informations sur les JavaScript résolveurs, consultez la section Présentation des [JavaScript résolveurs.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

Les résultats ont la structure suivante :

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

Les champs sont définis comme suit :

** `items` **  
Liste contenant les éléments renvoyés par la synchronisation.

** `nextToken` **  
S'il peut y avoir plus de résultats, `nextToken` contient un jeton de pagination que vous pouvez utiliser dans une autre demande. AWS AppSync chiffre et masque le jeton de pagination renvoyé par DynamoDB. Cela empêche que les données provenant de votre table ne soient accidentellement communiquées au mandataire. De plus, ces jetons de pagination ne peuvent pas être utilisés entre différentes fonctions ou résolveurs.

** `scannedCount` **  
Nombre d'éléments récupérés par DynamoDB avant l'application d'une expression de filtre (le cas échéant).

** `startedAt` **  
Le moment, en millisecondes Epoch, où l'opération de synchronisation a commencé, que vous pouvez stocker localement et utiliser dans une autre requête comme argument `lastSync`. Si un jeton de pagination a été inclus dans la requête, cette valeur sera la même que celle renvoyée par la requête pour la première page de résultats.

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

L'exemple suivant est un gestionnaire de demande de fonction pour la requête GraphQL :. `syncPosts(nextToken: String, lastSync: AWSTimestamp)`

Dans cet exemple, si `lastSync` est omis, toutes les entrées de la table de base sont renvoyées. Si `lastSync` est fourni, seules les entrées de la table de synchronisation delta qui ont changé depuis `lastSync` sont renvoyées.

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

L'objet de `BatchGetItem` requête vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer une `BatchGetItem` demande à DynamoDB pour récupérer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de demande, vous devez spécifier les éléments suivants :
+ Les noms de tables à partir desquels récupérer les éléments
+ Les clés des éléments à récupérer dans chaque table

Les limites `BatchGetItem` DynamoDB s'appliquent et **aucune expression de condition** ne peut être fournie.

La structure de l'objet de `BatchGetItem` requête est la suivante :

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

Les champs sont définis comme suit :

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

### BatchGetItem liste des champs
<a name="js-BatchGetItem-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `BatchGetItem`, ce champ doit être défini sur `BatchGetItem`. Cette valeur est obligatoire.

** `tables` **  
Les tables DynamoDB à partir desquelles récupérer les éléments. La valeur est une carte où les noms de table sont spécifiés en tant que clés de la carte. Vous devez fournir au moins une table. Cette valeur `tables` est obligatoire.    
** `keys` **  
Liste des clés DynamoDB représentant la clé primaire des éléments à récupérer. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)  
** `consistentRead` **  
S'il faut utiliser une lecture cohérente lors de l'exécution d'une *GetItem*opération. Cette valeur est facultative et est définie comme *faux* par défaut.  
**`projection`**  
Projection utilisée pour spécifier les attributs à renvoyer par l'opération DynamoDB. Pour plus d'informations sur les projections, voir [Projections](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Ce champ est facultatif.

Objets à mémoriser :
+ Si un élément n'a pas été récupéré à partir de la table, un élément *null* s'affiche dans le bloc de données pour cette table.
+ Les résultats d'invocation sont triés par table, en fonction de l'ordre dans lequel ils ont été fournis dans l'objet de demande.
+ Chaque `Get` commande contenue dans a `BatchGetItem` est atomique, mais un lot peut être partiellement traité. Si un lot est traité partiellement en raison d'une erreur, les clés non traitées sont renvoyées dans le cadre du résultat de l'appel dans le bloc *unprocessedKeys*.
+  `BatchGetItem` est limité à 100 clés.

Pour l'exemple de gestionnaire de demandes de fonction suivant :

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

Le résultat de l'appel disponible dans `ctx.result` est le suivant :

```
{
   "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` contient des détails sur l'erreur. La présence **des données** clés, **UnprocessedKeys**, et de chaque clé de table fournie dans le résultat de l'objet de demande de fonction est garantie dans le résultat de l'appel. Les éléments ayant été supprimés apparaissent dans le bloc de **données**. Les éléments qui n'ont pas été traités sont marqués comme *null* dans le bloc de données et sont placés dans le bloc **unprocessedKeys**.

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

L'objet de `BatchDeleteItem` requête vous permet de demander à la fonction AWS AppSync DynamoDB de `BatchWriteItem` demander à DynamoDB de supprimer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de demande, vous devez spécifier les éléments suivants :
+ Les noms de tables à partir desquels supprimer les éléments
+ Les clés des éléments à supprimer dans chaque table

Les limites `BatchWriteItem` DynamoDB s'appliquent et **aucune expression de condition** ne peut être fournie.

La structure de l'objet de `BatchDeleteItem` requête est la suivante :

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

Les champs sont définis comme suit :

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

### BatchDeleteItem liste des champs
<a name="js-BatchDeleteItem-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `BatchDeleteItem`, ce champ doit être défini sur `BatchDeleteItem`. Cette valeur est obligatoire.

** `tables` **  
Les tables DynamoDB dont les éléments doivent être supprimés. Chaque table est une liste de clés DynamoDB représentant la clé primaire des éléments à supprimer. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Vous devez fournir au moins une table. La `tables` valeur est obligatoire.

Objets à mémoriser :
+ Contrairement à l'opération `DeleteItem`, l'élément complètement supprimé n'est pas renvoyé dans la réponse. Seule la clé passée est renvoyée.
+ Si un élément n'a pas été supprimé à partir de la table, un élément *null* s'affiche dans le bloc de données pour cette table.
+ Les résultats d'invocation sont triés par table, en fonction de l'ordre dans lequel ils ont été fournis dans l'objet de demande.
+ Chaque `Delete` commande à l'intérieur de a `BatchDeleteItem` est atomique. Cependant, un lot peut être partiellement traité. Si un lot est traité partiellement en raison d'une erreur, les clés non traitées sont renvoyées dans le cadre du résultat de l'appel dans le bloc *unprocessedKeys*.
+  `BatchDeleteItem` est limité à 25 clés.
+ Cette opération **n'est pas** prise en charge lorsqu'elle est utilisée avec la détection de conflits. L'utilisation des deux en même temps peut entraîner une erreur.

Pour l'exemple de gestionnaire de demandes de fonction suivant :

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

Le résultat de l'appel disponible dans `ctx.result` est le suivant :

```
{
   "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` contient des détails sur l'erreur. La présence **des données** clés, **UnprocessedKeys**, et de chaque clé de table fournie dans l'objet de demande de fonction est garantie dans le résultat de l'appel. Les éléments ayant été supprimés sont présents dans le bloc de **données**. Les éléments qui n'ont pas été traités sont marqués comme *null* dans le bloc de données et sont placés dans le bloc **unprocessedKeys**.

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

L'objet de `BatchPutItem` requête vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer une `BatchWriteItem` demande à DynamoDB pour placer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de demande, vous devez spécifier les éléments suivants :
+ Les noms de tables dans lesquels placer les éléments
+ Les éléments complets à placer dans chaque table

Les limites `BatchWriteItem` DynamoDB s'appliquent et **aucune expression de condition** ne peut être fournie.

La structure de l'objet de `BatchPutItem` requête est la suivante :

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

Les champs sont définis comme suit :

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

### BatchPutItem liste des champs
<a name="js-BatchPutItem-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `BatchPutItem`, ce champ doit être défini sur `BatchPutItem`. Cette valeur est obligatoire.

** `tables` **  
Les tables DynamoDB dans lesquelles placer les éléments. Chaque entrée de table représente une liste d'éléments DynamoDB à insérer pour cette table spécifique. Vous devez fournir au moins une table. Cette valeur est obligatoire.

Objets à mémoriser :
+ Les éléments entièrement insérés sont renvoyés dans la réponse, en cas de succès.
+ Si un élément n'a pas été inséré dans la table, un élément *null* s'affiche dans le bloc de données pour cette table.
+ Les éléments insérés sont triés par table, en fonction de l'ordre dans lequel ils ont été fournis dans l'objet de demande.
+ Chaque `Put` commande contenue dans a `BatchPutItem` est atomique, mais un lot peut être partiellement traité. Si un lot est traité partiellement en raison d'une erreur, les clés non traitées sont renvoyées dans le cadre du résultat de l'appel dans le bloc *unprocessedKeys*.
+  `BatchPutItem` est limité à 25 éléments.
+ Cette opération **n'est pas** prise en charge lorsqu'elle est utilisée avec la détection de conflits. L'utilisation des deux en même temps peut entraîner une erreur.

Pour l'exemple de gestionnaire de demandes de fonction suivant :

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

Le résultat de l'appel disponible dans `ctx.result` est le suivant :

```
{
   "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` contient des détails sur l'erreur. La présence **des données** clés, **UnprocessedItems** et de chaque clé de table fournie dans l'objet de demande est garantie dans le résultat de l'appel. Les éléments ayant été insérés sont dans le bloc de **données**. Les éléments qui n'ont pas été traités sont marqués comme *null* dans le bloc de données et sont placés dans le bloc **unprocessedItems**.

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

L'objet de `TransactGetItems` requête vous permet de demander à la fonction AWS AppSync DynamoDB d'envoyer une `TransactGetItems` demande à DynamoDB pour récupérer plusieurs éléments, éventuellement sur plusieurs tables. Pour cet objet de demande, vous devez spécifier les éléments suivants :
+ Nom de la table de chaque élément de requête dans lequel extraire l'élément
+ La clé de chaque élément de requête à récupérer à partir de chaque table

Les limites `TransactGetItems` DynamoDB s'appliquent et **aucune expression de condition** ne peut être fournie.

La structure de l'objet de `TransactGetItems` requête est la suivante :

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

Les champs sont définis comme suit :

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

### TransactGetItems liste des champs
<a name="js-TransactGetItems-list-col"></a>

** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `TransactGetItems`, ce champ doit être défini sur `TransactGetItems`. Cette valeur est obligatoire.

** `transactItems` **  
Les éléments de requête à inclure. La valeur est un tableau d'éléments de requête. Au moins un élément de requête doit être fourni. Cette valeur `transactItems` est obligatoire.    
** `table` **  
La table DynamoDB à partir de laquelle récupérer l'élément. La valeur est une chaîne du nom de la table. Cette valeur `table` est obligatoire.  
** `key` **  
La clé DynamoDB représentant la clé primaire de l'élément à récupérer. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)  
**`projection`**  
Projection utilisée pour spécifier les attributs à renvoyer par l'opération DynamoDB. Pour plus d'informations sur les projections, voir [Projections](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-projections). Ce champ est facultatif.

Objets à mémoriser :
+ Si une transaction réussit, l'ordre des éléments récupérés dans le bloc `items` sera le même que celui des éléments de la requête.
+ Les transactions sont effectuées d'une all-or-nothing manière ou d'une autre. Si un élément de requête provoque une erreur, la transaction entière ne sera pas effectuée et les détails de l'erreur seront retournés.
+ Un élément de requête qui ne peut pas être récupéré n'est pas une erreur. Au lieu de cela, un élément *null* apparaît dans le bloc *éléments* dans la position correspondante.
+ Si l'erreur d'une transaction est *TransactionCanceledException*survenue, le `cancellationReasons` bloc sera rempli. L'ordre des motifs d'annulation dans le bloc `cancellationReasons` sera le même que l'ordre des éléments de demande.
+  `TransactGetItems`est limité à 100 articles demandés.

Pour l'exemple de gestionnaire de demandes de fonction suivant :

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

Si la transaction réussit et que seul le premier élément demandé est extrait, le résultat d'appel disponible dans `ctx.result` est le suivant :

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

Si la transaction échoue en raison *TransactionCanceledException*du premier élément de demande, le résultat de l'invocation disponible `ctx.result` est le suivant :

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

`ctx.error` contient des détails sur l'erreur. Les **éléments** clés et **cancellationReasons** sont nécessairement présents dans `ctx.result`.

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

L'objet de `TransactWriteItems` requête vous permet de demander à la fonction AWS AppSync DynamoDB de `TransactWriteItems` demander à DynamoDB d'écrire plusieurs éléments, éventuellement dans plusieurs tables. Pour cet objet de demande, vous devez spécifier les éléments suivants :
+ Nom de la table de destination de chaque élément de requête
+ L'opération de chaque élément de demande à effectuer. Quatre types d'opérations sont pris en charge : *PutItem*UpdateItem**, *DeleteItem*, et *ConditionCheck* 
+ La clé de chaque élément de demande à écrire

Les limites `TransactWriteItems` DynamoDB s'appliquent.

La structure de l'objet de `TransactWriteItems` requête est la suivante :

```
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 champs
<a name="js-TransactWriteItems-list"></a>

### TransactWriteItems liste des champs
<a name="js-TransactWriteItems-list-col"></a>

**Les champs sont définis comme suit : **    
** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `TransactWriteItems`, ce champ doit être défini sur `TransactWriteItems`. Cette valeur est obligatoire.  
** `transactItems` **  
Les éléments de requête à inclure. La valeur est un tableau d'éléments de requête. Au moins un élément de requête doit être fourni. Cette valeur `transactItems` est obligatoire.  
Pour `PutItem`, les champs sont définis comme suit :    
** `table` **  
La table DynamoDB de destination. La valeur est une chaîne du nom de la table. Cette valeur `table` est obligatoire.  
** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `PutItem`, ce champ doit être défini sur `PutItem`. Cette valeur est obligatoire.  
** `key` **  
La clé DynamoDB représentant la clé primaire de l'élément à insérer. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.  
** `attributeValues` **  
Le reste des attributs de l'élément doit être placé dans DynamoDB. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Ce champ est facultatif.  
** `condition` **  
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `PutItem` remplace toute entrée existante pour cet élément. Vous pouvez spécifier s'il faut récupérer l'élément existant en cas d'échec de la vérification de l'état. Pour plus d'informations sur les conditions transactionnelles, consultez la section [Expressions des conditions de transaction](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Cette valeur est facultative.
Pour `UpdateItem`, les champs sont définis comme suit :    
** `table` **  
Table DynamoDB à mettre à jour. La valeur est une chaîne du nom de la table. Cette valeur `table` est obligatoire.  
** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `UpdateItem`, ce champ doit être défini sur `UpdateItem`. Cette valeur est obligatoire.  
** `key` **  
La clé DynamoDB représentant la clé primaire de l'élément à mettre à jour. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.  
** `update` **  
La `update` section vous permet de spécifier une expression de mise à jour qui décrit comment mettre à jour l'élément dans DynamoDB. Pour plus d'informations sur l'écriture d'expressions de mise à jour, consultez la documentation [ UpdateExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html). Cette section est obligatoire.  
** `condition` **  
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `UpdateItem` met à jour l'entrée existante quel que soit son état actuel. Vous pouvez spécifier s'il faut récupérer l'élément existant en cas d'échec de la vérification de l'état. Pour plus d'informations sur les conditions transactionnelles, consultez la section [Expressions des conditions de transaction](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Cette valeur est facultative.
Pour `DeleteItem`, les champs sont définis comme suit :    
** `table` **  
Table DynamoDB dans laquelle vous souhaitez supprimer l'élément. La valeur est une chaîne du nom de la table. Cette valeur `table` est obligatoire.  
** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `DeleteItem`, ce champ doit être défini sur `DeleteItem`. Cette valeur est obligatoire.  
** `key` **  
La clé DynamoDB représentant la clé primaire de l'élément à supprimer. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.  
** `condition` **  
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Si aucune condition n'est spécifiée, la requête `DeleteItem` supprime un élément existant quel que soit son état actuel. Vous pouvez spécifier s'il faut récupérer l'élément existant en cas d'échec de la vérification de l'état. Pour plus d'informations sur les conditions transactionnelles, consultez la section [Expressions des conditions de transaction](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Cette valeur est facultative.
Pour `ConditionCheck`, les champs sont définis comme suit :    
** `table` **  
Table DynamoDB dans laquelle vérifier la condition. La valeur est une chaîne du nom de la table. Cette valeur `table` est obligatoire.  
** `operation` **  
L'opération DynamoDB à effectuer. Pour que vous puissiez effectuer l'opération DynamoDB `ConditionCheck`, ce champ doit être défini sur `ConditionCheck`. Cette valeur est obligatoire.  
** `key` **  
La clé DynamoDB représentant la clé primaire de l'élément dont l'état doit être vérifié. Les éléments DynamoDB peuvent avoir une seule clé de hachage ou une clé de hachage et une clé de tri, selon la structure de la table. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cette valeur est obligatoire.  
** `condition` **  
Condition permettant de déterminer si la demande doit réussir ou non, en fonction de l'état de l'objet déjà dans DynamoDB. Vous pouvez spécifier s'il faut récupérer l'élément existant en cas d'échec de la vérification de l'état. Pour plus d'informations sur les conditions transactionnelles, consultez la section [Expressions des conditions de transaction](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions). Cette valeur est obligatoire.

Objets à mémoriser :
+ Seules les clés des éléments de demande sont renvoyées dans la réponse, si elles réussissent. L'ordre des clés sera le même que l'ordre des éléments de demande.
+ Les transactions sont effectuées d'une all-or-nothing manière ou d'une autre. Si un élément de requête provoque une erreur, la transaction entière ne sera pas effectuée et les détails de l'erreur seront retournés.
+ Aucun élément de demande ne peut cibler le même élément. Dans le cas contraire, ils provoqueront *TransactionCanceledException*une erreur.
+ Si l'erreur d'une transaction est *TransactionCanceledException*survenue, le `cancellationReasons` bloc sera rempli. Si la vérification de l'état d'un élément de demande échoue **et** que vous n'avez pas spécifié `returnValuesOnConditionCheckFailure` comme étant `false`, l'élément existant dans la table est récupéré et stocké `item` à la position correspondante du bloc `cancellationReasons`.
+  `TransactWriteItems`est limité à 100 articles demandés.
+ Cette opération **n'est pas** prise en charge lorsqu'elle est utilisée avec la détection de conflits. L'utilisation des deux en même temps peut entraîner une erreur.

Pour l'exemple de gestionnaire de demandes de fonction suivant :

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

Si la transaction réussit, le résultat d'appel disponible dans `ctx.result` est le suivant :

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

Si la transaction échoue en raison de l'échec de la vérification de l'état de la `PutItem` demande, le résultat de l'invocation disponible `ctx.result` est le suivant :

```
{
    "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` contient des détails sur l'erreur. Les clés **clés** et **cancellationReasons** sont nécessairement présentes dans `ctx.result`.

# Système de types (mappage des demandes)
<a name="js-aws-appsync-resolver-reference-dynamodb-typed-values-request"></a>

Lorsque vous utilisez la fonction AWS AppSync DynamoDB pour appeler vos tables DynamoDB AWS AppSync , vous devez connaître le type de chaque valeur à utiliser dans cet appel. Cela est dû au fait que DynamoDB prend en charge un plus grand nombre de primitives de type que GraphQL ou JSON (telles que les ensembles et les données binaires). AWS AppSync a besoin de quelques conseils lors de la traduction entre GraphQL et DynamoDB, sinon il devra émettre des hypothèses sur la manière dont les données sont structurées dans votre table.

[https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html#Programming.LowLevelAPI.DataTypeDescriptors](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html#Programming.LowLevelAPI.DataTypeDescriptors)

Une valeur DynamoDB est représentée par un objet JSON contenant une seule paire clé-valeur. La clé indique le type DynamoDB et la valeur indique la valeur elle-même. Dans l'exemple suivant, la clé `S` indique que la valeur est une chaîne, et la valeur `identifier` est la valeur de chaîne elle-même.

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

Notez que l'objet JSON ne peut pas avoir plus d'une paire clé-valeur. Si plusieurs paires clé-valeur sont spécifiées, l'objet de la requête n'est pas analysé.

Une valeur DynamoDB est utilisée n'importe où dans un objet de requête où vous devez spécifier une valeur. Vous devrez notamment procéder ainsi dans les sections suivantes : `key` et `attributeValue`, ainsi que la section `expressionValues` des sections d'expression. Dans l'exemple suivant, la `identifier` valeur DynamoDB String est affectée au `id` champ dans `key` une section (peut-être dans `GetItem` un objet de requête).

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

 **Types pris en charge** 

AWS AppSync prend en charge les types de scalaire, de document et d'ensemble DynamoDB suivants :

**Type de chaîne `S` **  
Valeur de chaîne unique. Une valeur de chaîne DynamoDB est indiquée par :  

```
{ "S" : "some string" }
```
Voici un exemple d'utilisation :  

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

**Type d'ensemble de chaîne `SS` **  
Ensemble de valeurs de chaîne. La valeur d'un ensemble de chaînes DynamoDB est indiquée par :  

```
{ "SS" : [ "first value", "second value", ... ] }
```
Voici un exemple d'utilisation :  

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

**Type de nombre `N` **  
Valeur numérique unique. La valeur d'un numéro DynamoDB est indiquée par :  

```
{ "N" : 1234 }
```
Voici un exemple d'utilisation :  

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

**Type d'ensemble de nombres `NS` **  
Ensemble de valeurs de nombres. La valeur d'un ensemble de numéros DynamoDB est indiquée par :  

```
{ "NS" : [ 1, 2.3, 4 ... ] }
```
Voici un exemple d'utilisation :  

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

**Type binaire `B` **  
Valeur binaire. Une valeur binaire DynamoDB est désignée par :  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
Notez que la valeur est en fait une chaîne, où la chaîne est la représentation codée en base64 des données binaires. AWS AppSync décode cette chaîne dans sa valeur binaire avant de l'envoyer à DynamoDB. AWS AppSync utilise le schéma de décodage base64 tel que défini par la RFC 2045 : tout caractère qui n'est pas dans l'alphabet base64 est ignoré.  
Voici un exemple d'utilisation :  

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

**Type d'ensemble binaire `BS` **  
Ensemble de valeurs binaires. La valeur d'un ensemble binaire DynamoDB est désignée par :  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
Notez que la valeur est en fait une chaîne, où la chaîne est la représentation codée en base64 des données binaires. AWS AppSync décode cette chaîne dans sa valeur binaire avant de l'envoyer à DynamoDB. AWS AppSync utilise le schéma de décodage base64 tel que défini par la RFC 2045 : tout caractère qui n'est pas dans l'alphabet base64 est ignoré.  
Voici un exemple d'utilisation :  

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

**Type booléen `BOOL` **  
Valeur booléenne. Une valeur booléenne DynamoDB est désignée par :  

```
{ "BOOL" : true }
```
Notez que seules les valeurs `true` et `false` sont valides.  
Voici un exemple d'utilisation :  

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

**Type de liste `L` **  
Liste de toutes les autres valeurs DynamoDB prises en charge. Une valeur de liste DynamoDB est indiquée par :  

```
{ "L" : [ ... ] }
```
Notez que la valeur est une valeur composée, la liste pouvant contenir zéro ou plus de toute valeur DynamoDB prise en charge (y compris les autres listes). La liste peut également contenir une combinaison de différents types.  
Voici un exemple d'utilisation :  

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

**Type de mappage `M` **  
Représentant une collection non ordonnée de paires clé-valeur d'autres valeurs DynamoDB prises en charge. La valeur d'une carte DynamoDB est indiquée par :  

```
{ "M" : { ... } }
```
Notez qu'un mappage peut contenir zéro ou plusieurs paires clé-valeur. La clé doit être une chaîne, et la valeur peut être n'importe quelle valeur DynamoDB prise en charge (y compris d'autres cartes). Le mappage peut également contenir une combinaison de différents types.  
Voici un exemple d'utilisation :  

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

**Type nul `NULL` **  
Valeur null. Une valeur DynamoDB Null est désignée par :  

```
{ "NULL" : null }
```
Voici un exemple d'utilisation :  

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

Pour plus d'informations sur chaque type, consultez la [documentation DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html).

# Système de types (mappage des réponses)
<a name="js-aws-appsync-resolver-reference-dynamodb-typed-values-responses"></a>

Lorsque vous recevez une réponse de DynamoDB AWS AppSync , elle est automatiquement convertie en types primitifs GraphQL et JSON. Chaque attribut de DynamoDB est décodé et renvoyé dans le contexte du gestionnaire de réponses.

Par exemple, si DynamoDB renvoie ce qui suit :

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

Lorsque le résultat est renvoyé par votre résolveur de pipeline, il le AWS AppSync convertit en types GraphQL et JSON sous la forme suivante :

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

Cette section explique comment AWS AppSync convertir les types de scalaire, de document et d'ensemble DynamoDB suivants :

**Type de chaîne `S` **  
Valeur de chaîne unique. Une valeur DynamoDB String est renvoyée sous forme de chaîne.  
Par exemple, si DynamoDB a renvoyé la valeur de chaîne DynamoDB suivante :  

```
{ "S" : "some string" }
```
AWS AppSync le convertit en chaîne de caractères :  

```
"some string"
```

**Type d'ensemble de chaîne `SS` **  
Ensemble de valeurs de chaîne. Une valeur d'ensemble de chaînes DynamoDB est renvoyée sous forme de liste de chaînes.  
Par exemple, si DynamoDB a renvoyé la valeur DynamoDB String Set suivante :  

```
{ "SS" : [ "first value", "second value", ... ] }
```
AWS AppSync le convertit en une liste de chaînes :  

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

**Type de nombre `N` **  
Valeur numérique unique. La valeur d'un numéro DynamoDB est renvoyée sous forme de nombre.  
Par exemple, si DynamoDB a renvoyé la valeur du numéro DynamoDB suivante :  

```
{ "N" : 1234 }
```
AWS AppSync le convertit en nombre :  

```
1234
```

**Type d'ensemble de nombres `NS` **  
Ensemble de valeurs de nombres. Une valeur d'ensemble de numéros DynamoDB est renvoyée sous forme de liste de nombres.  
Par exemple, si DynamoDB a renvoyé la valeur DynamoDB Number Set suivante :  

```
{ "NS" : [ 67.8, 12.2, 70 ] }
```
AWS AppSync le convertit en une liste de nombres :  

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

**Type binaire `B` **  
Valeur binaire. Une valeur binaire DynamoDB est renvoyée sous forme de chaîne contenant la représentation base64 de cette valeur.  
Par exemple, si DynamoDB a renvoyé la valeur binaire DynamoDB suivante :  

```
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
```
AWS AppSync le convertit en une chaîne contenant la représentation base64 de la valeur :  

```
"SGVsbG8sIFdvcmxkIQo="
```
Notez que les données binaires sont codées selon le schéma Base64 tel que spécifié dans [RFC 4648](https://tools.ietf.org/html/rfc4648) et [RFC 2045](https://tools.ietf.org/html/rfc2045).

**Type d'ensemble binaire `BS` **  
Ensemble de valeurs binaires. Une valeur d'ensemble binaire DynamoDB est renvoyée sous forme de liste de chaînes contenant la représentation base64 des valeurs.  
Par exemple, si DynamoDB a renvoyé la valeur d'ensemble binaire DynamoDB suivante :  

```
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
```
AWS AppSync le convertit en une liste de chaînes contenant la représentation en base64 des valeurs :  

```
[ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ]
```
Notez que les données binaires sont codées selon le schéma Base64 tel que spécifié dans [RFC 4648](https://tools.ietf.org/html/rfc4648) et [RFC 2045](https://tools.ietf.org/html/rfc2045).

**Type booléen `BOOL` **  
Valeur booléenne. Une valeur booléenne DynamoDB est renvoyée sous forme de booléen.  
Par exemple, si DynamoDB a renvoyé la valeur booléenne DynamoDB suivante :  

```
{ "BOOL" : true }
```
AWS AppSync le convertit en booléen :  

```
true
```

**Type de liste `L` **  
Liste de toutes les autres valeurs DynamoDB prises en charge. Une valeur de liste DynamoDB est renvoyée sous forme de liste de valeurs, chaque valeur interne étant également convertie.  
Par exemple, si DynamoDB a renvoyé la valeur de liste DynamoDB suivante :  

```
{ "L" : [
      { "S"  : "A string value" },
      { "N"  : 1 },
      { "SS" : [ "Another string value", "Even more string values!" ] }
   ]
}
```
AWS AppSync le convertit en une liste de valeurs converties :  

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

**Type de mappage `M` **  
 key/value Collection de toutes les autres valeurs DynamoDB prises en charge. Une valeur de carte DynamoDB est renvoyée sous forme d'objet JSON, où key/value chacune est également convertie.  
Par exemple, si DynamoDB a renvoyé la valeur de carte DynamoDB suivante :  

```
{ "M" : {
      "someString" : { "S"  : "A string value" },
      "someNumber" : { "N"  : 1 },
      "stringSet"  : { "SS" : [ "Another string value", "Even more string values!" ] }
   }
}
```
AWS AppSync le convertit en objet JSON :  

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

**Type nul `NULL` **  
Valeur null.  
Par exemple, si DynamoDB a renvoyé la valeur Null DynamoDB suivante :  

```
{ "NULL" : null }
```
AWS AppSync le convertit en valeur nulle :  

```
null
```

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

Lorsque vous interrogez des objets dans DynamoDB à `Query` l'aide des opérations `Scan` et, vous pouvez éventuellement spécifier `filter` un qui évalue les résultats et renvoie uniquement les valeurs souhaitées.

La propriété de filtre d'une `Scan` demande `Query` ou possède la structure suivante :

```
type DynamoDBExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
};
```

Les champs sont définis comme suit :

** `expression` **  
Expression de la requête. Pour plus d'informations sur la façon d'écrire des expressions de filtre, consultez la documentation [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html) [et QueryFilter ScanFilter](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ScanFilter.html) DynamoDB. Ce champ doit être spécifié.

** `expressionNames` **  
Substituts des espaces réservés de *nom* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de nom utilisé dans le `expression`. La valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de nom des attributs de l'expression utilisés dans l'`expression`.

** `expressionValues` **  
Substituts des espaces réservés de *valeur* des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de valeur utilisé dans l'`expression`, et la valeur doit être typée. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cela doit être spécifié. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de valeur des attributs de l'expression utilisés dans l'`expression`.

## Exemple
<a name="js-id18"></a>

L'exemple suivant est une section de filtre pour une demande, dans laquelle les entrées extraites de DynamoDB ne sont renvoyées que si le titre commence par l'argument. `title` 

Ici, nous utilisons le `util.transform.toDynamoDBFilterExpression` pour créer automatiquement un filtre à partir d'un objet :

```
const filter = util.transform.toDynamoDBFilterExpression({
  title: { beginsWith: 'far away' },
});

const request = {};
request.filter = JSON.parse(filter);
```

Cela génère le filtre suivant :

```
{
  "filter": {
    "expression": "(begins_with(#title,:title_beginsWith))",
    "expressionNames": { "#title": "title" },
    "expressionValues": {
      ":title_beginsWith": { "S": "far away" }
    }
  }
}
```

# Expressions conditionnelles
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-expressions"></a>

Lorsque vous mutez des objets dans DynamoDB à l'aide des opérations`PutItem`,`UpdateItem`, et `DeleteItem` DynamoDB, vous pouvez éventuellement spécifier une expression de condition qui détermine si la demande doit aboutir ou non, en fonction de l'état de l'objet déjà présent dans DynamoDB avant l'exécution de l'opération.

La fonction AWS AppSync DynamoDB permet de spécifier une expression de condition `PutItem` dans`UpdateItem`, `DeleteItem` et des objets de demande, ainsi qu'une stratégie à suivre si la condition échoue et que l'objet n'a pas été mis à jour.

## Exemple 1
<a name="js-id19"></a>

L'objet de `PutItem` demande suivant ne possède pas d'expression de condition. Par conséquent, il place un élément dans DynamoDB même s'il existe déjà un élément portant la même clé, remplaçant ainsi l'élément existant.

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

## Exemple 2
<a name="js-id20"></a>

L'`PutItem`objet suivant possède une expression de condition qui permet à l'opération de réussir uniquement si un élément portant la même clé n'existe *pas* dans DynamoDB.

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

Par défaut, si le contrôle de condition échoue, la fonction AWS AppSync DynamoDB génère une erreur pour la mutation.

Cependant, la fonction AWS AppSync DynamoDB propose des fonctionnalités supplémentaires pour aider les développeurs à gérer certains cas extrêmes courants :
+ Si les fonctions AWS AppSync DynamoDB peuvent déterminer que la valeur actuelle dans DynamoDB correspond au résultat souhaité, elles traitent l'opération comme si elle avait réussi de toute façon.
+ Au lieu de renvoyer une erreur, vous pouvez configurer la fonction pour appeler une fonction Lambda personnalisée afin de décider comment la fonction DynamoDB doit AWS AppSync gérer l'échec.

Ils sont décrits plus en détail dans la section [Gestion d'un échec de vérification d'état](#condition-check).

[Pour plus d'informations sur les expressions de conditions DynamoDB, consultez la documentation DynamoDB. ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)

## Spécifier une condition
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-specification"></a>

Les objets `PutItem``UpdateItem`,, et `DeleteItem` request permettent tous de spécifier une `condition` section facultative. Si cette section est omise, aucune vérification de condition n'est effectuée. Si elle est spécifiée, la condition doit être true pour que l'opération réussisse.

Une section `condition` a la structure suivante :

```
type ConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
  equalsIgnore?: string[];
  consistentRead?: boolean;
  conditionalCheckFailedHandler?: {
    strategy: 'Custom' | 'Reject';
    lambdaArn?: string;
  };
};
```

Les champs suivants spécifient la condition :

** `expression` **  
Expression de mise à jour elle-même. Pour plus d'informations sur la façon d'écrire des expressions de condition, consultez la documentation [ ConditionExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Ce champ doit être spécifié.

** `expressionNames` **  
Substituts des espaces réservés de nom des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé utilisé dans l'*expression*, et la valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de nom des attributs de l'expression utilisés dans l'*expression*.

** `expressionValues` **  
Substituts des espaces réservés de valeur des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de valeur utilisé dans l'expression, et la valeur doit être typée. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cela doit être spécifié. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de valeur des attributs de l'expression utilisés dans l'expression.

Les champs restants indiquent à la fonction AWS AppSync DynamoDB comment gérer un échec de vérification de condition :

** `equalsIgnore` **  
Lorsqu'une vérification de condition échoue lors de l'utilisation de l'`PutItem`opération, la fonction AWS AppSync DynamoDB compare l'élément actuellement dans DynamoDB à l'élément qu'elle a essayé d'écrire. S'ils sont identiques, il traite l'opération comme si elle avait réussi. Vous pouvez utiliser le `equalsIgnore` champ pour spécifier une liste d'attributs à AWS AppSync ignorer lors de cette comparaison. Par exemple, si la seule différence était un `version` attribut, il traite l'opération comme si elle avait réussi. Ce champ est facultatif.

** `consistentRead` **  
Lorsqu'une vérification de condition échoue, AWS AppSync obtient la valeur actuelle de l'élément auprès de DynamoDB à l'aide d'une lecture hautement cohérente. Vous pouvez utiliser ce champ pour indiquer à la fonction AWS AppSync DynamoDB d'utiliser une lecture éventuellement cohérente à la place. Ce champ est facultatif et contient `true` par défaut.

** `conditionalCheckFailedHandler` **  
Cette section vous permet de spécifier comment la fonction AWS AppSync DynamoDB traite un échec de vérification de condition après avoir comparé la valeur actuelle dans DynamoDB au résultat attendu. Cette section est facultative. Si elle n'est pas spécifiée, la valeur par défaut est une stratégie `Reject`.    
** `strategy` **  
Stratégie adoptée par la fonction AWS AppSync DynamoDB après avoir comparé la valeur actuelle dans DynamoDB au résultat attendu. Ce champ est obligatoire et les valeurs suivantes sont possibles :    
** `Reject` **  
La mutation échoue et une erreur est ajoutée à la réponse GraphQL.  
** `Custom` **  
La fonction AWS AppSync DynamoDB invoque une fonction Lambda personnalisée pour décider comment gérer l'échec du contrôle de condition. Lorsque la `strategy` est définie sur `Custom`, le champ `lambdaArn` doit contenir l'ARN de la fonction Lambda à appeler.  
** `lambdaArn` **  
L'ARN de la fonction Lambda à invoquer qui détermine la manière dont la fonction DynamoDB doit gérer l' AWS AppSync échec de la vérification des conditions. Ce champ doit être spécifié uniquement lorsque `strategy` est défini sur `Custom`. Pour plus d'informations sur l'utilisation de cette fonctionnalité, consultez la section [Gestion d'un échec de vérification d'état](#condition-check).

## Gestion d'un échec de vérification d'état
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-handling"></a>

Lorsqu'une vérification de condition échoue, la fonction AWS AppSync DynamoDB peut transmettre l'erreur liée à la mutation et la valeur actuelle de l'objet à l'aide de l'utilitaire. `util.appendError` Cependant, la fonction AWS AppSync DynamoDB propose des fonctionnalités supplémentaires pour aider les développeurs à gérer certains cas extrêmes courants :
+ Si les fonctions AWS AppSync DynamoDB peuvent déterminer que la valeur actuelle dans DynamoDB correspond au résultat souhaité, elles traitent l'opération comme si elle avait réussi de toute façon.
+ Au lieu de renvoyer une erreur, vous pouvez configurer la fonction pour appeler une fonction Lambda personnalisée afin de décider comment la fonction DynamoDB doit AWS AppSync gérer l'échec.

Le diagramme de ce processus est le suivant :

![\[Flowchart showing process for transforming requests with mutation attempts and value checks.\]](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/DynamoDB-condition-check-failure-handling.png)


### Vérification du résultat souhaité
<a name="js-checking-for-the-desired-result"></a>

Lorsque le contrôle de condition échoue, la fonction AWS AppSync DynamoDB exécute une requête `GetItem` DynamoDB pour obtenir la valeur actuelle de l'élément auprès de DynamoDB. Par défaut, il utilise une lecture à cohérence forte, mais cela peut être configuré à l'aide du champ `consistentRead` dans le bloc `condition` et comparé aux résultats prévus :
+ Pour l'`PutItem`opération, la fonction AWS AppSync DynamoDB compare la valeur actuelle à celle qu'elle a tenté d'écrire, en excluant les attributs répertoriés `equalsIgnore` dans la comparaison. Si les éléments sont identiques, il considère l'opération comme réussie et renvoie l'élément extrait de DynamoDB. Dans le cas contraire, il suit la stratégie configurée.

  Par exemple, si l'objet de la `PutItem` requête ressemblait à ce qui suit :

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

  Et si l'élément actuellement dans DynamoDB ressemble à ce qui suit :

  ```
  {
     "id" : { "S" : "1" },
     "name" : { "S" : "Steve" },
     "version" : { "N" : 8 }
  }
  ```

  La fonction AWS AppSync DynamoDB comparait l'élément qu'elle a essayé d'écrire à la valeur actuelle, constatait que la seule différence était `version` le champ, mais comme elle est configurée pour ignorer `version` le champ, elle considère l'opération comme réussie et renvoie l'élément extrait de DynamoDB.
+ Pour l'`DeleteItem`opération, la fonction AWS AppSync DynamoDB vérifie qu'un élément a été renvoyé par DynamoDB. Si aucun élément n'a été renvoyé, il traite l'opération comme réussie. Dans le cas contraire, il suit la stratégie configurée.
+ Pour l'`UpdateItem`opération, la fonction AWS AppSync DynamoDB ne dispose pas de suffisamment d'informations pour déterminer si l'élément actuellement dans DynamoDB correspond au résultat attendu et suit donc la stratégie configurée.

Si l'état actuel de l'objet dans DynamoDB est différent du résultat attendu, la fonction AWS AppSync DynamoDB suit la stratégie configurée, soit pour rejeter la mutation, soit pour invoquer une fonction Lambda pour déterminer la marche à suivre.

### Suivre la stratégie du « rejet »
<a name="js-following-the-reject-strategy"></a>

Lorsque vous suivez la `Reject` stratégie, la fonction AWS AppSync DynamoDB renvoie une erreur pour la mutation.

Par exemple, si nous avons la demande de mutation suivante :

```
mutation {
    updatePerson(id: 1, name: "Steve", expectedVersion: 1) {
        Name
        theVersion
    }
}
```

Si l'élément renvoyé par DynamoDB ressemble à ce qui suit :

```
{
   "id" : { "S" : "1" },
   "name" : { "S" : "Steve" },
   "version" : { "N" : 8 }
}
```

Et le gestionnaire de réponse aux fonctions ressemble à ce qui suit :

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

La réponse GraphQL se présente comme suit :

```
{
  "data": null,
  "errors": [
    {
      "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ)"
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      ...
    }
  ]
}
```

Notez également que si des champs de l'objet renvoyé sont remplis par d'autres résolveurs et que la mutation a réussi, ils ne seront pas résolus lorsque l'objet sera renvoyé dans la section `error`.

### Suivre la stratégie « personnalisée »
<a name="js-following-the-custom-strategy"></a>

Lorsque vous suivez la `Custom` stratégie, la fonction AWS AppSync DynamoDB invoque une fonction Lambda pour décider de la marche à suivre. La fonction Lambda choisit l'une des options suivantes :
+  `reject` la mutation. Cela indique à la fonction AWS AppSync DynamoDB de se comporter comme si la stratégie configurée l'`Reject`était, renvoyant une erreur pour la mutation et la valeur actuelle de l'objet dans DynamoDB, comme décrit dans la section précédente.
+  `discard` la mutation. Cela indique à la fonction AWS AppSync DynamoDB d'ignorer silencieusement l'échec de la vérification des conditions et renvoie la valeur dans DynamoDB.
+  `retry` la mutation. Cela indique à la fonction AWS AppSync DynamoDB de réessayer la mutation avec un nouvel objet de requête.

 **Requête d'appel Lambda**

La fonction AWS AppSync DynamoDB appelle la fonction Lambda spécifiée dans le. `lambdaArn` Il utilise le même `service-role-arn` que celui configuré sur la source de données. La charge utile de l'appel a la structure suivante :

```
{
    "arguments": { ... },
    "requestMapping": {... },
    "currentValue": { ... },
    "resolver": { ... },
    "identity": { ... }
}
```

Les champs sont définis comme suit :

** `arguments` **  
Arguments de la mutation GraphQL. Il s'agit des mêmes arguments que les arguments disponibles pour l'objet de requête dans`context.arguments`.

** `requestMapping` **  
L'objet de la demande pour cette opération.

** `currentValue` **  
La valeur actuelle de l'objet dans DynamoDB.

** `resolver` **  
Informations sur le AWS AppSync résolveur ou la fonction.

** `identity` **  
Informations sur l'appelant. Il s'agit de la même chose que les informations d'identité disponibles pour l'objet de la demande dans`context.identity`.

Exemple complet de la charge utile :

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

 **Réponse à l'appel de Lambda** 

La fonction Lambda peut inspecter la charge utile d'appel et appliquer n'importe quelle logique métier pour décider de la manière dont la fonction DynamoDB doit gérer AWS AppSync la panne. Il existe trois options pour gérer l'échec de vérification de la condition :
+  `reject` la mutation. La charge utile de la réponse pour cette option doit avoir cette structure :

  ```
  {
      "action": "reject"
  }
  ```

  Cela indique à la fonction AWS AppSync DynamoDB de se comporter comme si la stratégie configurée l'`Reject`était, renvoyant une erreur pour la mutation et la valeur actuelle de l'objet dans DynamoDB, comme décrit dans la section ci-dessus.
+  `discard` la mutation. La charge utile de la réponse pour cette option doit avoir cette structure :

  ```
  {
      "action": "discard"
  }
  ```

  Cela indique à la fonction AWS AppSync DynamoDB d'ignorer silencieusement l'échec de la vérification des conditions et renvoie la valeur dans DynamoDB.
+  `retry` la mutation. La charge utile de la réponse pour cette option doit avoir cette structure :

  ```
  {
      "action": "retry",
      "retryMapping": { ... }
  }
  ```

  Cela indique à la fonction AWS AppSync DynamoDB de réessayer la mutation avec un nouvel objet de requête. La structure de la `retryMapping` section dépend de l'opération DynamoDB et constitue un sous-ensemble de l'objet de demande complet pour cette opération.

  Pour `PutItem`, la section `retryMapping` a la structure suivante. Pour une description du `attributeValues` champ, voir [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
      }
  }
  ```

  Pour `UpdateItem`, la section `retryMapping` a la structure suivante. Pour une description de `update` cette section, voir [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
      }
  }
  ```

  Pour `DeleteItem`, la section `retryMapping` a la structure suivante.

  ```
  {
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  Il n'y a aucun moyen de spécifier une autre opération ou une autre clé sur laquelle travailler. La fonction AWS AppSync DynamoDB autorise uniquement les tentatives de la même opération sur le même objet. D'autre part, la section `condition` ne permet pas de spécifier un `conditionalCheckFailedHandler`. Si la nouvelle tentative échoue, la fonction AWS AppSync DynamoDB suit la stratégie. `Reject`

Voici un exemple de fonction Lambda pour traiter une demande `PutItem` qui a échoué. La logique métier s'adresse à celui qui effectue l'appel. S'il a été créé par`jeffTheAdmin`, il réessaie la demande en mettant à jour le `version` et à `expectedVersion` partir de l'élément actuellement présent dans DynamoDB. Dans le cas contraire, il rejette la mutation.

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

# Expressions des conditions de transaction
<a name="js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions"></a>

Les expressions de conditions de transaction sont disponibles dans les demandes des quatre types d'opérations dans`TransactWriteItems`, à savoir`PutItem`,`DeleteItem`,`UpdateItem`, et`ConditionCheck`.

Pour`PutItem`, et `DeleteItem``UpdateItem`, l'expression de condition de transaction est facultative. En effet`ConditionCheck`, l'expression de la condition de transaction est obligatoire.

## Exemple 1
<a name="js-id22"></a>

Le gestionnaire de demande de `DeleteItem` fonction transactionnelle suivant ne possède pas d'expression de condition. Par conséquent, il supprime l'élément dans DynamoDB.

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

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

## Exemple 2
<a name="js-id23"></a>

Le gestionnaire de demande de `DeleteItem` fonction transactionnelle suivant possède une expression de condition de transaction qui permet à l'opération de réussir uniquement si l'auteur de cette publication porte un certain nom.

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

Si la vérification de condition échoue, elle provoque `TransactionCanceledException` et les détails de l'erreur sont renvoyés dans `ctx.result.cancellationReasons`. Notez que par défaut, l'ancien élément de DynamoDB à l'origine de l'échec de la vérification des conditions sera renvoyé. `ctx.result.cancellationReasons`

## Spécifier une condition
<a name="js-id24"></a>

Les objets `PutItem``UpdateItem`,, et `DeleteItem` request permettent tous de spécifier une `condition` section facultative. Si cette section est omise, aucune vérification de condition n'est effectuée. Si elle est spécifiée, la condition doit être true pour que l'opération réussisse. Le `ConditionCheck` doit avoir une section `condition` à spécifier. La condition doit être vraie pour que l'ensemble de la transaction réussisse.

Une section `condition` a la structure suivante :

```
type TransactConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string };
  expressionValues?: { [key: string]: string };
  returnValuesOnConditionCheckFailure: boolean;
};
```

Les champs suivants spécifient la condition :

** `expression` **  
Expression de mise à jour elle-même. Pour plus d'informations sur la façon d'écrire des expressions de condition, consultez la documentation [ ConditionExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Ce champ doit être spécifié.

** `expressionNames` **  
Substituts des espaces réservés de nom des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé utilisé dans l'*expression*, et la valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de nom des attributs de l'expression utilisés dans l'*expression*.

** `expressionValues` **  
Substituts des espaces réservés de valeur des attributs de l'expression, sous la forme de paires clé-valeur. La clé correspond à un espace réservé de valeur utilisé dans l'expression, et la valeur doit être typée. Pour plus d'informations sur la façon de spécifier une « valeur saisie », voir [Système de types (mappage des demandes).](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) Cela doit être spécifié. Ce champ est facultatif et doit être renseigné uniquement avec des substituts des espaces réservés de valeur des attributs de l'expression utilisés dans l'expression.

** `returnValuesOnConditionCheckFailure` **  
Spécifiez s'il faut récupérer l'élément dans DynamoDB en cas d'échec d'une vérification de condition. L'élément récupéré est dans `ctx.result.cancellationReasons[<index>].item`, où `<index>` est l'index de l'élément de demande qui a échoué à la vérification de condition. Cette valeur est définie par défaut sur true.

# Projections
<a name="js-aws-appsync-resolver-reference-dynamodb-projections"></a>

Lorsque vous lisez des objets dans DynamoDB à `GetItem` l'aide des opérations `Scan``Query`,`BatchGetItem`,, `TransactGetItems` et, vous pouvez éventuellement spécifier une projection qui identifie les attributs souhaités. La structure de la propriété de projection est la suivante, similaire à celle des filtres : 

```
type DynamoDBExpression = {
  expression: string;
  expressionNames?: { [key: string]: string}
};
```

Les champs sont définis comme suit :

** `expression` **  
L'expression de projection, qui est une chaîne. Pour récupérer un seul attribut, spécifiez son nom. Pour les attributs multiples, les noms doivent être des valeurs séparées par des virgules. Pour plus d'informations sur l'écriture d'expressions de projection, consultez la documentation des expressions de projection [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html). Ce champ est obligatoire. 

** `expressionNames` **  
Les substitutions aux espaces réservés aux *noms* d'attributs d'expression sous forme de paires clé-valeur. La clé correspond à un espace réservé de nom utilisé dans le `expression`. La valeur doit être une chaîne correspondant au nom d'attribut de l'élément dans DynamoDB. Ce champ est facultatif et ne doit être rempli qu'avec des substitutions pour les espaces réservés aux noms d'attributs d'expression utilisés dans le. `expression` Pour plus d'informations`expressionNames`, consultez la documentation [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html). 

## Exemple 1
<a name="js-id22"></a>

L'exemple suivant est une section de projection pour une JavaScript fonction dans laquelle seuls les attributs `author` et B `id` sont renvoyés par DynamoDB :

```
projection : {
    expression : "#author, id",
    expressionNames : {
        "#author" : "author"
    }
}
```

**Astuce**  
Vous pouvez accéder à votre ensemble de sélection de requêtes GraphQL à l'aide de. [selectionSetList](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html#aws-appsync-resolver-context-reference-info-js) Ce champ vous permet de cadrer votre expression de projection de manière dynamique en fonction de vos besoins.

**Note**  
Lorsque vous utilisez des expressions de projection avec les `Scan` opérations `Query` et, la valeur de `select` doit être`SPECIFIC_ATTRIBUTES`. Pour plus d'informations, consultez la documentation [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-Select).

# AWS AppSync JavaScript référence de la fonction de résolution pour OpenSearch
<a name="resolver-reference-elasticsearch-js"></a>

Le AWS AppSync résolveur pour Amazon OpenSearch Service vous permet d'utiliser GraphQL pour stocker et récupérer des données dans les domaines de service OpenSearch existants de votre compte. Ce résolveur fonctionne en vous permettant de mapper une requête GraphQL entrante en OpenSearch une demande de service, puis de mapper la réponse OpenSearch du service à GraphQL. Cette section décrit les gestionnaires de demandes et de réponses aux fonctions pour les opérations de OpenSearch service prises en charge.

## Demande
<a name="request-js"></a>

La plupart des objets de demande de OpenSearch service ont une structure commune dans laquelle seuls quelques éléments changent. L'exemple suivant exécute une recherche dans un domaine de OpenSearch service, dans lequel les documents sont de type `post` et sous `id` lesquels ils sont indexés. Les paramètres de recherche sont définis dans la section `body`, avec un grand nombre de clauses de requête courants définies dans le champ `query`. Cet exemple recherche des documents contenant `"Nadia"` ou `"Bailey"`, ou les deux, dans le champ `author` d'un document :

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

## Réponse
<a name="response-mapping-template"></a>

Comme pour les autres sources de données, OpenSearch Service envoie une réponse AWS AppSync qui doit être convertie en GraphQL.

La plupart des requêtes GraphQL recherchent le `_source` champ à partir d'une réponse de OpenSearch service. Comme vous pouvez effectuer des recherches pour renvoyer un document individuel ou une liste de documents, deux modèles de réponse courants sont utilisés dans OpenSearch Service :

 **Liste des résultats** 

```
export function response(ctx) {
  const entries = [];
  for (const entry of ctx.result.hits.hits) {
    entries.push(entry['_source']);
  }
  return entries;
}
```

 **Élément individuel** 

```
export function response(ctx) {
  return ctx.result['_source']
}
```

## `operation` field
<a name="operation-field"></a>

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Méthode ou verbe HTTP (GET, POST, PUT, HEAD ou DELETE) qui AWS AppSync envoie au domaine OpenSearch de service. La clé et la valeur doivent être une chaîne.

```
"operation" : "PUT"
```

## `path` field
<a name="path-field"></a>

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Le chemin de recherche d'une demande OpenSearch de service auprès de AWS AppSync. Cela forme une URL pour le verbe HTTP de l'opération. La clé et la valeur doivent être des chaînes.

```
"path" : "/indexname/type"

"path" : "/indexname/type/_search"
```

Lorsque le gestionnaire de demandes est évalué, ce chemin est envoyé dans le cadre de la requête HTTP, y compris le domaine de OpenSearch service. Ainsi, l'exemple précédent pourrait donner :

```
GET https://opensearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
```

## `params` field
<a name="params-field"></a>

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Permet de spécifier l'action exécutée par votre recherche, plus couramment en définissant la valeur de **requête** à l'intérieur du **corps**. Toutefois, il existe plusieurs autres capacités qui peuvent être configurées, comme la mise en forme des réponses.
+  **headers** 

  Informations d'en-tête, sous forme de paires clé-valeur. La clé et la valeur doivent être des chaînes. Par exemple :

  ```
  "headers" : {
      "Content-Type" : "application/json"
  }
  ```

   
**Note**  
AWS AppSync ne prend actuellement en charge que le format JSON en tant que fichier`Content-Type`.
+  **queryString** 

  Paires clé-valeur qui spécifient les options courantes, telles que la mise en forme du code pour les réponses JSON. La clé et la valeur doivent être une chaîne. Par exemple, si vous souhaitez obtenir un JSON mis en forme correctement, vous devez utiliser :

  ```
  "queryString" : {
      "pretty" : "true"
  }
  ```
+  **body** 

  Il s'agit de la partie principale de votre demande, qui permet AWS AppSync de créer une demande de recherche bien formée pour votre domaine OpenSearch de service. La clé doit être une chaîne composée d'un objet. Voici quelques démonstrations.

 **Exemple 1** 

Renvoyer tous les documents avec une ville correspondant à « seattle » :

```
export function request(ctx) {
  return {
    operation: 'GET',
    path: '/id/post/_search',
    params: {
      headers: {},
      queryString: {},
      body: { from: 0, size: 50, query: { match: { city: 'seattle' } } },
    },
  };
}
```

 **Exemple 2** 

Renvoyer tous les documents correspondant à « washington » comme ville ou État :

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

## Transmission de variables
<a name="passing-variables"></a>

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Vous pouvez également transmettre des variables dans le cadre de l'évaluation dans votre gestionnaire de demandes. Par exemple, supposons que vous ayez une requête GraphQL similaire à la suivante :

```
query {
    searchForState(state: "washington"){
        ...
    }
}
```

Le gestionnaire de demande de fonction peut être le suivant :

```
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 référence de la fonction de résolution pour Lambda
<a name="resolver-reference-lambda-js"></a>

Vous pouvez utiliser des AWS AppSync fonctions et des résolveurs pour appeler les fonctions Lambda situées dans votre compte. Vous pouvez façonner les charges utiles de vos demandes et la réponse de vos fonctions Lambda avant de les renvoyer à vos clients. Vous pouvez également spécifier le type d'opération à effectuer dans votre objet de demande. Cette section décrit les demandes relatives aux opérations Lambda prises en charge.

## Objet Requête
<a name="request-object-js"></a>

L'objet de requête Lambda gère les champs liés à votre fonction Lambda :

```
export type LambdaRequest = {
  operation: 'Invoke' | 'BatchInvoke';
  invocationType?: 'RequestResponse' | 'Event';
  payload: unknown;
};
```

Voici un exemple qui utilise une `invoke` opération dont les données de charge utile sont le `getPost` champ d'un schéma GraphQL avec ses arguments issus du contexte :

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

L'intégralité du document de mappage est transmise en entrée à votre fonction Lambda, de sorte que l'exemple précédent ressemble désormais à ceci :

```
{
  "operation": "Invoke",
  "payload": {
    "field": "getPost",
    "arguments": {
      "input": {
        "id": "postId1",
      }
    }
  }
}
```

### Opération
<a name="operation-js"></a>

La source de données Lambda vous permet de définir deux opérations `operation` sur le terrain : `Invoke` et. `BatchInvoke` L'`Invoke`opération permet de AWS AppSync savoir d'appeler votre fonction Lambda pour chaque résolveur de champs GraphQL. `BatchInvoke`indique de regrouper AWS AppSync les requêtes pour le champ GraphQL actuel. Le champ `operation` est obligatoire.

En effet`Invoke`, la demande résolue correspond à la charge utile d'entrée de la fonction Lambda. Modifions l'exemple ci-dessus :

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Ceci est résolu et transmis à la fonction Lambda, qui pourrait ressembler à ceci :

```
{
  "operation": "Invoke",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

En `BatchInvoke` effet, la demande est appliquée à chaque résolveur de champs du lot. Par souci de concision, AWS AppSync fusionne toutes les `payload` valeurs de demande dans une liste sous un seul objet correspondant à l'objet de la demande. L'exemple de gestionnaire de demandes suivant illustre la fusion :

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: ctx,
  };
}
```

Cette demande est évaluée et résolue dans le document de mappage suivant :

```
{
  "operation": "BatchInvoke",
  "payload": [
    {...}, // context for batch item 1
    {...}, // context for batch item 2
    {...}  // context for batch item 3
  ]
}
```

Chaque élément de la `payload` liste correspond à un seul article du lot. La fonction Lambda devrait également renvoyer une réponse sous forme de liste correspondant à l'ordre des éléments envoyés dans la demande :

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

### Charge utile
<a name="payload-js"></a>

Le `payload` champ est un conteneur utilisé pour transmettre des données à la fonction Lambda. Si le `operation` champ est défini sur`BatchInvoke`, AWS AppSync regroupe les `payload` valeurs existantes dans une liste. Le champ `payload` est facultatif.

### Types d’invocation
<a name="async-invocation-type-js"></a>

La source de données Lambda vous permet de définir deux types d'invocation : et. `RequestResponse` `Event` [Les types d'invocation sont synonymes des types d'invocation définis dans l'API Lambda.](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) Le type `RequestResponse` d'invocation permet d' AWS AppSync appeler votre fonction Lambda de manière synchrone pour attendre une réponse. L'`Event`invocation vous permet d'appeler votre fonction Lambda de manière asynchrone. [Pour plus d'informations sur la façon dont Lambda gère les demandes de type `Event` invocation, consultez Invocation asynchrone.](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html) Le champ `invocationType` est facultatif. Si ce champ n'est pas inclus dans la demande, le type d'`RequestResponse`appel AWS AppSync sera défini par défaut.

Quel que soit `invocationType` le champ, la demande résolue correspond à la charge utile d'entrée de la fonction Lambda. Modifions l'exemple ci-dessus :

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    invocationType: 'Event',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

Ceci est résolu et transmis à la fonction Lambda, qui pourrait ressembler à ceci :

```
{
  "operation": "Invoke",
  "invocationType": "Event",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

Lorsque l'`BatchInvoke`opération est utilisée conjointement avec le champ de type d'`Event`appel, elle AWS AppSync fusionne le résolveur de champ de la même manière que celle mentionnée ci-dessus, et la demande est transmise à votre fonction Lambda sous forme d'événement asynchrone sous la forme d'une liste de valeurs. `payload` La réponse d'une demande de type `Event` invocation aboutit à une `null` valeur sans gestionnaire de réponse :

```
{
  "data": {
    "field": null
  }
}
```

Nous vous recommandons de désactiver la mise en cache des résolveurs pour les résolveurs de type `Event` invocation, car ceux-ci ne seraient pas envoyés à Lambda en cas d'accès au cache.

## Objet Réponse
<a name="response-object-js"></a>

Comme pour les autres sources de données, votre fonction Lambda envoie une réponse AWS AppSync qui doit être convertie en un type GraphQL. Le résultat de la fonction Lambda est contenu dans la propriété de `context` résultat ()`context.result`.

Si la forme de la réponse de votre fonction Lambda correspond à la forme du type GraphQL, vous pouvez transférer la réponse à l'aide du gestionnaire de réponse de fonction suivant :

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

Aucun champ obligatoire ni aucune restriction de forme ne s'appliquent à l'objet de réponse. Cependant, comme GraphQL est fortement typé, la réponse résolue doit correspondre au type GraphQL attendu.

## Réponse par lots de la fonction Lambda
<a name="aws-appsync-resolver-reference-lambda-batched-response-js"></a>

Si le champ `operation` est défini sur `BatchInvoke`, AWS AppSync attend une liste d'éléments renvoyée par la fonction Lambda. Afin de AWS AppSync faire correspondre chaque résultat à l'élément de demande d'origine, la liste de réponses doit correspondre en taille et en ordre. Il est valide d'avoir des `null` éléments dans la liste de réponses ; elle `ctx.result` est définie sur *null* en conséquence.

# AWS AppSync JavaScript référence de fonction de résolution pour la source de EventBridge données
<a name="resolver-reference-eventbridge-js"></a>

La demande et AWS AppSync la réponse de la fonction de résolution utilisées avec la source de EventBridge données vous permettent d'envoyer des événements personnalisés au EventBridge bus Amazon.

## Demande
<a name="request-js"></a>

Le gestionnaire de demandes vous permet d'envoyer plusieurs événements personnalisés à un bus d' EventBridge événements :

```
export function request(ctx) {
  return {
    "operation" : "PutEvents",
    "events" : [{}]
  }
}
```

La définition de type d'une EventBridge `PutEvents` demande est la suivante :

```
type PutEventsRequest = {
  operation: 'PutEvents'
  events: {
    source: string
    detail: { [key: string]: any }
    detailType: string
    resources?: string[]
    time?: string // RFC3339 Timestamp format
  }[]
}
```

## Réponse
<a name="response-js"></a>

Si l'`PutEvents`opération est réussie, la réponse du formulaire EventBridge est incluse dans le `ctx.result` :

```
export function response(ctx) {
  if(ctx.error)
    util.error(ctx.error.message, ctx.error.type, ctx.result)
  else
    return ctx.result
}
```

Les erreurs qui se produisent lors de l'exécution d'`PutEvents`opérations telles que `InternalExceptions` ou `Timeouts` apparaîtront dans`ctx.error`. Pour obtenir la liste EventBridge des erreurs courantes, consultez la [référence des erreurs EventBridge courantes](https://docs.aws.amazon.com/eventbridge/latest/APIReference/CommonErrors.html).

Ils `result` auront la définition de type suivante :

```
type PutEventsResult = {
  Entries: {
    ErrorCode: string
    ErrorMessage: string
    EventId: string
  }[]
  FailedEntryCount: number
}
```
+ **Entrées**

  L'événement ingéré entraîne à la fois un succès et un échec. Si l'ingestion a réussi, l'entrée `EventID` en contient. Sinon, vous pouvez utiliser le `ErrorCode` et `ErrorMessage` pour identifier le problème lié à l'entrée.

  Pour chaque enregistrement, l'index de l'élément de réponse est le même que celui du tableau de requêtes.
+ **FailedEntryCount**

  Le nombre d'entrées ayant échoué. Cette valeur est représentée par un entier.

Pour plus d'informations sur la réponse de`PutEvents`, voir [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html#API_PutEvents_ResponseElements).

**Exemple de réponse 1**

L'exemple suivant est une `PutEvents` opération avec deux événements réussis :

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        }
    ],
    "FailedEntryCount" : 0
}
```

**Exemple de réponse 2**

L'exemple suivant est une `PutEvents` opération comportant trois événements, deux réussites et un échec :

```
{
    "Entries" : [ 
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        }, 
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        },
        {
            "ErrorCode" : "SampleErrorCode",
            "ErrorMessage" : "Sample Error Message"
        }
    ],
    "FailedEntryCount" : 1
}
```

## Champs de `PutEvents`
<a name="putevents-field"></a>

`PutEvents`contient les champs du modèle de mappage suivants :
+ **Version**

  Commun à tous les modèles de mappage de demandes, le `version` champ définit la version utilisée par le modèle. Ce champ est obligatoire. La valeur `2018-05-29` est la seule version prise en charge pour les modèles de EventBridge mappage.
+ **Opération**

  La seule opération prise en charge est`PutEvents`. Cette opération vous permet d'ajouter des événements personnalisés à votre bus d'événements.
+ **Événements**

  Un ensemble d'événements qui seront ajoutés au bus d'événements. Ce tableau doit avoir une allocation de 1 à 10 éléments.

  L'objet `Event` comporte les champs suivants :
  + `"source"`: chaîne qui définit la source de l'événement.
  + `"detail"`: objet JSON que vous pouvez utiliser pour joindre des informations sur l'événement. Ce champ peut être une carte vide (`{ }`).
  + `"detailType`: chaîne identifiant le type d'événement.
  + `"resources"`: tableau JSON de chaînes identifiant les ressources impliquées dans l'événement. Ce champ peut être un tableau vide.
  + `"time"`: l'horodatage de l'événement fourni sous forme de chaîne. Cela doit suivre le format d'[RFC3339](https://www.rfc-editor.org/rfc/rfc3339.txt)horodatage.

Les extraits ci-dessous sont des exemples d'objets valides `Event` :

**Exemple 1**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : [1,2,3,4],
        "key2" : "strval"
    },
    "detailType" : "sampleDetailType",
    "resources" : ["Resouce1", "Resource2"],
    "time" : "2022-01-10T05:00:10Z"
}
```

**Exemple 2**

```
{
    "source" : "source1",
    "detail" : {},
    "detailType" : "sampleDetailType"
}
```

**Exemple 3**

```
{
    "source" : "source1",
    "detail" : {
        "key1" : 1200
    },
    "detailType" : "sampleDetailType",
    "resources" : []
}
```

# AWS AppSync JavaScript référence de fonction de résolution pour la source de `None` données
<a name="resolver-reference-none-js"></a>

La demande et AWS AppSync la réponse de la fonction de résolution avec la source de données de type *None* vous permettent de façonner les demandes pour les opérations AWS AppSync locales.

## Demande
<a name="request-js"></a>

Le gestionnaire de demandes peut être simple et vous permet de transmettre autant d'informations contextuelles que possible via le `payload` champ.

```
type NONERequest = {
  payload: any;
};
```

Voici un exemple où les arguments du champ sont transmis à la charge utile :

```
export function request(ctx) {
  return {
    payload: context.args
  };
}
```

La valeur du `payload` champ sera transmise au gestionnaire de réponses aux fonctions et sera disponible dans`context.result`.

## Charge utile
<a name="payload-js"></a>

Le `payload` champ est un conteneur qui peut être utilisé pour transmettre toutes les données qui sont ensuite mises à la disposition du gestionnaire de réponse aux fonctions.

 Le champ `payload` est facultatif.

## Réponse
<a name="response-js"></a>

En l'absence de source de données, la valeur du `payload` champ sera transmise au gestionnaire de réponse aux fonctions et définie sur la `context.result` propriété.

Si la forme de la valeur du `payload` champ correspond exactement à la forme du type GraphQL, vous pouvez transférer la réponse à l'aide du gestionnaire de réponse suivant :

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

Aucun champ obligatoire ni aucune restriction de forme ne s'appliquent à la réponse de retour. Cependant, comme GraphQL est fortement typé, la réponse résolue doit correspondre au type GraphQL attendu.

# AWS AppSync JavaScript référence de fonction de résolution pour HTTP
<a name="resolver-reference-http-js"></a>

Les fonctions de résolution AWS AppSync HTTP vous permettent d'envoyer des demandes depuis n'importe quel point AWS AppSync de terminaison HTTP, et des réponses depuis votre point de terminaison HTTP vers AWS AppSync. Avec votre gestionnaire de demandes, vous pouvez fournir des indications AWS AppSync sur la nature de l'opération à invoquer. Cette section décrit les différentes configurations du résolveur HTTP pris en charge.

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

L'extrait suivant est un exemple de requête HTTP POST, avec un `text/plain` corps :

```
export function request(ctx) {
  return {
    method: 'POST',
    params: {
      headers: { 'Content-Type': 'text/plain' },
      body: 'this is an example of text body',
    },
    resourcePath: '/',
  };
}
```

## Method
<a name="method-js"></a>

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Méthode ou verbe HTTP (GET, POST, PUT, PATCH ou DELETE) qui AWS AppSync envoie au point de terminaison HTTP.

```
"method": "PUT"
```

## ResourcePath
<a name="resourcepath-js"></a>

 

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Chemin de la ressource à laquelle vous souhaitez accéder. Avec le point de terminaison dans la source de données HTTP, le chemin de la ressource constitue l'URL à laquelle le AWS AppSync service envoie une demande.

```
"resourcePath": "/v1/users"
```

Lorsque la demande est évaluée, ce chemin est envoyé dans le cadre de la requête HTTP, y compris le point de terminaison HTTP. Ainsi, l'exemple précédent pourrait donner :

```
PUT <endpoint>/v1/users
```

## Champs de paramètres
<a name="params-field-js"></a>

**Note**  
Cela s'applique uniquement au gestionnaire de demandes. 

Permet de spécifier l'action exécutée par votre recherche, plus couramment en définissant la valeur de **query** à l'intérieur de la section **body**. Toutefois, il existe plusieurs autres capacités qui peuvent être configurées, comme la mise en forme des réponses.

** **headers** **  
Informations d'en-tête, sous forme de paires clé-valeur. La clé et la valeur doivent être des chaînes.  
Par exemple :  

```
"headers" : {
    "Content-Type" : "application/json"
}
```
Les en-têtes `Content-Type` actuellement pris en charge sont les suivants :  

```
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
```
Vous ne pouvez pas définir les en-têtes HTTP suivants :  

```
HOST
CONNECTION
USER-AGENT
EXPECTATION
TRANSFER_ENCODING
CONTENT_LENGTH
```

** **query** **  
Paires clé-valeur qui spécifient les options courantes, telles que la mise en forme du code pour les réponses JSON. La clé et la valeur doivent être une chaîne. L'exemple suivant montre comment envoyer une chaîne de requête comme `?type=json` :  

```
"query" : {
    "type" : "json"
}
```

** **body** **  
Le corps contient le corps de la demande HTTP que vous choisissez de définir. Le corps de la demande est toujours une chaîne encodée en UTF-8, sauf si le type de contenu spécifie le jeu de caractères.  

```
"body":"body string"
```

## Réponse
<a name="response-js"></a>

Consultez un exemple [ici](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-http-resolvers-js.html).

# AWS AppSync JavaScript référence de fonction de résolution pour Amazon RDS
<a name="resolver-reference-rds-js"></a>

La fonction et le résolveur AWS AppSync RDS permettent aux développeurs d'envoyer des SQL requêtes à une base de données de clusters Amazon Aurora à l'aide de l'API RDS Data et de récupérer le résultat de ces requêtes. Vous pouvez écrire SQL des instructions qui sont envoyées à l'API AWS AppSync de `rds` données en utilisant le modèle `sql` étiqueté par `rds` module du module ou en utilisant les `select` fonctions `insert` d'`remove`assistance du module. `update` AWS AppSync utilise l'[https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html)action du service de données RDS pour exécuter des instructions SQL sur la base de données. 

**Rubriques**
+ [Modèle balisé SQL](#sql-tagged-templates)
+ [Création de déclarations](#creating-statements)
+ [Récupération des données](#retrieving-data)
+ [Fonctions utilitaires](#utility-functions)
+ [SQL Select](#utility-functions-select)
+ [Insérer du code SQL](#utility-functions-insert)
+ [Mise à jour SQL](#utility-functions-update)
+ [Supprimer SQL](#utility-functions-delete)
+ [Forçage de type](#casting)

## Modèle balisé SQL
<a name="sql-tagged-templates"></a>

AWS AppSync le modèle `sql` balisé vous permet de créer une instruction statique capable de recevoir des valeurs dynamiques lors de l'exécution à l'aide d'expressions de modèle. AWS AppSync crée une carte variable à partir des valeurs d'expression pour créer une [https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html)requête envoyée à l'API de données sans serveur Amazon Aurora. Avec cette méthode, il n'est pas possible que les valeurs dynamiques transmises lors de l'exécution modifient l'instruction d'origine, ce qui pourrait entraîner une exécution involontaire. Toutes les valeurs dynamiques sont transmises sous forme de paramètres, ne peuvent pas modifier l'instruction d'origine et ne sont pas exécutées par la base de données. Cela rend votre requête moins vulnérable aux attaques SQL par injection.

**Note**  
Dans tous les cas, lorsque vous rédigez SQL des déclarations, vous devez suivre les consignes de sécurité afin de gérer correctement les données que vous recevez en entrée.

**Note**  
Le modèle `sql` balisé prend uniquement en charge le transfert de valeurs variables. Vous ne pouvez pas utiliser d'expression pour spécifier dynamiquement les noms des colonnes ou des tables. Vous pouvez toutefois utiliser des fonctions utilitaires pour créer des instructions dynamiques.

Dans l'exemple suivant, nous créons une requête qui filtre en fonction de la valeur de l'`col`argument défini dynamiquement dans la requête GraphQL au moment de l'exécution. La valeur ne peut être ajoutée à l'instruction qu'à l'aide de l'expression de balise :

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

En transmettant toutes les valeurs dynamiques via la carte des variables, nous nous appuyons sur le moteur de base de données pour gérer et nettoyer les valeurs en toute sécurité.

## Création de déclarations
<a name="creating-statements"></a>

Les fonctions et les résolveurs peuvent interagir avec les bases de données MySQL et PostgreSQL. Utilisez `createMySQLStatement` et `createPgStatement` respectivement pour créer des instructions. Par exemple, `createMySQLStatement` vous pouvez créer une requête MySQL. Ces fonctions acceptent jusqu'à deux instructions, ce qui est utile lorsqu'une demande doit récupérer des résultats immédiatement. Avec MySQL, vous pouvez faire :

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

**Note**  
`createPgStatement`et `createMySQLStatement` n'échappe pas aux instructions créées avec le modèle `sql` balisé et ne cite pas de citations.

## Récupération des données
<a name="retrieving-data"></a>

Le résultat de l'instruction SQL exécutée est disponible dans le gestionnaire de réponses de l'`context.result`objet. Le résultat est une chaîne JSON contenant les [éléments de réponse](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_ExecuteStatement.html#API_ExecuteStatement_ResponseElements) de l'`ExecuteStatement`action. Une fois analysé, le résultat prend la forme suivante :

```
type SQLStatementResults = {
    sqlStatementResults: {
        records: any[];
        columnMetadata: any[];
        numberOfRecordsUpdated: number;
        generatedFields?: any[]
    }[]
}
```

Vous pouvez utiliser cet `toJsonObject` utilitaire pour transformer le résultat en une liste d'objets JSON représentant les lignes renvoyées. Par exemple :

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

Notez que cela `toJsonObject` renvoie un tableau de résultats d'instructions. Si vous avez fourni une seule instruction, la longueur du tableau est`1`. Si vous avez fourni deux instructions, la longueur du tableau est`2`. Chaque résultat du tableau contient au `0` moins plusieurs lignes. `toJsonObject`renvoie `null` si la valeur du résultat n'est pas valide ou est inattendue.

## Fonctions utilitaires
<a name="utility-functions"></a>

Vous pouvez utiliser les aides utilitaires du module AWS AppSync RDS pour interagir avec votre base de données.

### SQL Select
<a name="utility-functions-select"></a>

L'`select`utilitaire crée une `SELECT` instruction pour interroger votre base de données relationnelle. 

**Usage de base**

Dans sa forme de base, vous pouvez spécifier la table que vous souhaitez interroger :

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

export function request(ctx) {

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

Notez que vous pouvez également spécifier le schéma dans l'identifiant de votre table :

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

export function request(ctx) {

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

**Spécification des colonnes**

Vous pouvez définir des colonnes à l'aide de `columns` cette propriété. S'il n'est pas défini sur une valeur, la valeur par défaut est : `*`

```
export function request(ctx) {

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

Vous pouvez également spécifier le tableau d'une colonne :

```
export function request(ctx) {

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

**Limites et compensations**

Vous pouvez appliquer `limit` et répondre `offset` à la requête :

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

**Commander par**

Vous pouvez trier vos résultats à l'aide de `orderBy` cette propriété. Fournissez un tableau d'objets spécifiant la colonne et une `dir` propriété facultative :

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

**Filtres**

Vous pouvez créer des filtres à l'aide de l'objet de condition spéciale :

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

Vous pouvez également combiner des filtres :

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

Vous pouvez également créer des `OR` déclarations :

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

Vous pouvez également annuler une condition avec `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 } }
        ]}
    }));
}
```

Vous pouvez également utiliser les opérateurs suivants pour comparer des valeurs :


| 
| 
| Opérateur | Description | Types de valeurs possibles | 
| --- |--- |--- |
| eq | Égal à | nombre, chaîne, booléen | 
| ne | Non égal à | nombre, chaîne, booléen | 
| le | Inférieur ou égal à | nombre, chaîne | 
| lt | Inférieur à | nombre, chaîne | 
| gm | Supérieur ou égal à | nombre, chaîne | 
| gt | Supérieur à | nombre, chaîne | 
| contient | Comme | chaîne | 
| NE CONTIENT PAS | Pas comme | chaîne | 
| Commence par | Commence par le préfixe | chaîne | 
| between | Entre deux valeurs | nombre, chaîne | 
| L'attribut existe | L'attribut n'est pas nul | nombre, chaîne, booléen | 
| size | vérifie la longueur de l'élément | chaîne | 

### Insérer du code SQL
<a name="utility-functions-insert"></a>

L'`insert`utilitaire fournit un moyen simple d'insérer des éléments d'une seule ligne dans votre base de données avec l'`INSERT`opération.

**Insertions d'un seul article**

Pour insérer un élément, spécifiez le tableau, puis transmettez votre objet de valeurs. Les clés d'objet sont mappées aux colonnes de votre tableau. Les noms des colonnes sont automatiquement ignorés et les valeurs sont envoyées à la base de données à l'aide de la variable map :

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

**Cas d'utilisation de MySQL**

Vous pouvez combiner un `insert` suivi d'un `select` pour récupérer la ligne que vous avez insérée :

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

**Cas d'utilisation de Postgres**

Avec Postgres, vous pouvez l'utiliser [https://www.postgresql.org/docs/current/dml-returning.html](https://www.postgresql.org/docs/current/dml-returning.html)pour obtenir des données à partir de la ligne que vous avez insérée. Il accepte `*` un tableau de noms de colonnes :

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

### Mise à jour SQL
<a name="utility-functions-update"></a>

L'`update`utilitaire vous permet de mettre à jour les lignes existantes. Vous pouvez utiliser l'objet condition pour appliquer des modifications aux colonnes spécifiées dans toutes les lignes qui répondent à la condition. Supposons, par exemple, que nous ayons un schéma qui nous permet de réaliser cette mutation. Nous voulons mettre à jour les `name` de `Person` avec la `id` valeur de`3`, mais uniquement si nous les connaissons (`known_since`) depuis l'année `2000` :

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

Notre résolveur de mises à jour ressemble à ceci :

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

Nous pouvons ajouter une vérification à notre condition pour nous assurer que seule la ligne dont la clé primaire est `id` égale à `3` est mise à jour. De même, pour Postgres`inserts`, vous pouvez utiliser `returning` pour renvoyer les données modifiées. 

### Supprimer SQL
<a name="utility-functions-delete"></a>

L'`remove`utilitaire vous permet de supprimer des lignes existantes. Vous pouvez utiliser l'objet de condition sur toutes les lignes qui répondent à la condition. Notez qu'il `delete` s'agit d'un mot clé réservé dans JavaScript. `remove`doit être utilisé à la place :

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

## Forçage de type
<a name="casting"></a>

Dans certains cas, vous souhaiterez peut-être plus de précisions quant au type d'objet approprié à utiliser dans votre déclaration. Vous pouvez utiliser les indications de type fournies pour spécifier le type de vos paramètres. AWS AppSync prend en charge les [mêmes indications de type](https://docs.aws.amazon.com//rdsdataservice/latest/APIReference/API_SqlParameter.html#rdsdtataservice-Type-SqlParameter-typeHint) que l'API Data. Vous pouvez convertir vos paramètres en utilisant les `typeHint` fonctions du AWS AppSync `rds` module. 

L'exemple suivant vous permet d'envoyer un tableau sous forme de valeur qui est convertie en objet JSON. Nous utilisons l'`->`opérateur pour récupérer l'élément situé `index` `2` dans le tableau JSON :

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

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

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

Le casting est également utile lors de la manipulation et de `DATE` la comparaison`TIME`, et `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)
}
```

Voici un autre exemple montrant comment envoyer la date et l'heure actuelles :

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

**Indications de type disponibles**
+ `typeHint.DATE`- Le paramètre correspondant est envoyé sous forme d'objet de `DATE` ce type à la base de données. Le format accepté est `YYYY-MM-DD`.
+ `typeHint.DECIMAL`- Le paramètre correspondant est envoyé sous forme d'objet de `DECIMAL` ce type à la base de données.
+ `typeHint.JSON`- Le paramètre correspondant est envoyé sous forme d'objet de `JSON` ce type à la base de données.
+ `typeHint.TIME`- La valeur de paramètre de chaîne correspondante est envoyée sous forme d'objet de `TIME` ce type à la base de données. Le format accepté est `HH:MM:SS[.FFF]`. 
+ `typeHint.TIMESTAMP`- La valeur de paramètre de chaîne correspondante est envoyée sous forme d'objet de `TIMESTAMP` ce type à la base de données. Le format accepté est `YYYY-MM-DD HH:MM:SS[.FFF]`.
+ `typeHint.UUID`- La valeur de paramètre de chaîne correspondante est envoyée sous forme d'objet de `UUID` ce type à la base de données.

# AWS AppSync JavaScript résolveur et référence de fonction pour le runtime Amazon Bedrock
<a name="resolver-reference-bedrock-js"></a>

Vous pouvez utiliser des AWS AppSync fonctions et des résolveurs pour invoquer des modèles sur Amazon Bedrock dans votre. Compte AWS Vous pouvez façonner les charges utiles de vos demandes et la réponse à partir de vos fonctions d'invocation modèles avant de les renvoyer à vos clients. Vous pouvez utiliser l'`InvokeModel`API du runtime Amazon Bedrock ou l'`Converse`API. Cette section décrit les demandes relatives aux opérations Amazon Bedrock prises en charge.

**Note**  
AWS AppSync ne prend en charge que les appels synchrones qui se terminent en 10 secondes. Il n'est pas possible d'appeler le stream APIs d'Amazon Bedrock. AWS AppSync prend uniquement en charge l'appel de modèles de base et de [profils d'inférence](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles.html) dans la même région que l' AWS AppSync API.

## Objet Requête
<a name="request_object"></a>

L'objet de `InvokeModel` requête vous permet d'interagir avec l'`InvokeModel`API d'Amazon Bedrock.

```
type BedrockInvokeModelRequest = {
  operation: 'InvokeModel';
  modelId: string;
  body: any;
  guardrailIdentifier?: string;
  guardrailVersion?: string;
  guardrailTrace?: string;
}
```

L'objet de `Converse` requête vous permet d'interagir avec l'`Converse`API d'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;
}
```

Consultez la [Référence de type](#type-reference-bedrock) section plus loin dans cette rubrique pour plus de détails.

À partir de vos fonctions et de vos résolveurs, vous pouvez créer directement vos objets de requête ou utiliser les fonctions d'assistance de @aws appsync/utils/ai pour créer la demande. Lorsque vous spécifiez l'identifiant du modèle (modelId) dans vos demandes, vous pouvez utiliser l'identifiant du modèle ou l'ARN du modèle.

L'exemple suivant utilise la `invokeModel` fonction pour résumer du texte à l'aide d'Amazon Titan Text G1 - Lite (amazon). titan-text-lite-v1). Un garde-corps configuré est utilisé pour identifier et bloquer ou filtrer le contenu indésirable dans le flux d'invite. Pour en savoir plus sur [Amazon Bedrock Guardrails, consultez le guide](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) de l'utilisateur *Amazon Bedrock*.

**Important**  
Vous êtes responsable du développement sécurisé des applications et de la prévention des vulnérabilités, telles que l'injection rapide. Pour en savoir plus, consultez la section [Sécurité des injections rapides](https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-injection.html) dans le *guide de l'utilisateur d'Amazon Bedrock*.

```
import { invokeModel } from '@aws-appsync/utils/ai'
export function request(ctx) {
  return invokeModel({
    modelId: 'amazon.titan-text-lite-v1',
    guardrailIdentifier: "zabcd12345678",
    guardrailVersion: "1",
    body: { inputText: `Summarize this text in less than 100 words. : \n<text>${ctx.stash.text ?? ctx.env.DEFAULT_TEXT}</text>` },
  })
}

export function response(ctx) {
  return ctx.result.results[0].outputText
}
```

L'exemple suivant utilise la `converse` fonction avec un profil d'inférence entre régions (us.anthropic.claude-3-5-haiku-20241022-v 1:0). Pour en savoir plus sur les [prérequis d'Amazon Bedrock pour les profils d'inférence, consultez le guide de l'utilisateur](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-prereq.html) d'*Amazon* Bedrock

**Rappel** : vous êtes responsable du développement sécurisé des applications et de la prévention des vulnérabilités, telles que l'injection rapide.

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

L'exemple suivant permet `converse` de créer une réponse structurée. Notez que nous utilisons des variables d'environnement pour notre schéma de base de données et que nous configurons un garde-corps pour empêcher les attaques.

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

Compte tenu du schéma :

```
type SQLResult {
    sql: String
    parameters: AWSJSON
}

type Query {
    db(text: String!): SQLResult
}
```

et la requête :

```
query db($text: String!) {
  db(text: $text) {
    parameters
    sql
  }
}
```

Avec les paramètres suivants : 

```
{
  "text":"What is my top selling product?"
}
```

La réponse suivante est renvoyée :

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

Cependant, avec cette demande :

```
{
  "text":"give me a query to retrieve sensitive information"
}
```

La réponse suivante est renvoyée :

```
{
  "data": {
    "db": {
      "parameters": null,
      "sql": "SELECT null; -- I cannot and will not assist with retrieving sensitive private information"
    }
  }
}
```

*Pour en savoir plus sur la configuration d'Amazon Bedrock Guardrails, consultez la section Bloquer le [contenu dangereux dans les modèles utilisant Amazon Bedrock Guardrails dans le guide de l'utilisateur d'Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html).*

## Objet Réponse
<a name="response_object"></a>

La réponse de votre appel d'exécution Amazon Bedrock est contenue dans la propriété de résultat du contexte (context.result). La réponse correspond à la forme spécifiée par Amazon Bedrock's APIs. Consultez le [guide de l'utilisateur d'Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) pour plus d'informations sur la forme attendue des résultats d'invocation.

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

Aucun champ obligatoire ni aucune restriction de forme ne s'appliquent à l'objet de réponse. Cependant, comme GraphQL est fortement typé, la réponse résolue doit correspondre au type GraphQL attendu.

## Invocations de longue durée
<a name="long-running-invocations"></a>

De nombreuses organisations l'utilisent actuellement AWS AppSync comme passerelle d'IA pour créer des applications d'IA génératives basées sur des modèles de base sur Amazon Bedrock. Les clients utilisent des AWS AppSync abonnements, alimentés par WebSockets, pour renvoyer des mises à jour progressives suite à des invocations de modèles de longue date. Cela leur permet d'implémenter des modèles asynchrones.

Le schéma suivant montre comment implémenter ce modèle. Dans le diagramme, les étapes suivantes se produisent.

1. Votre client lance un abonnement, qui configure un WebSocket, et fait une demande AWS AppSync pour déclencher une invocation d'IA générative.

1. AWS AppSync appelle votre AWS Lambda fonction en mode événement et renvoie immédiatement une réponse au client.

1. Votre fonction Lambda invoque le modèle sur Amazon Bedrock. La fonction Lambda peut utiliser une API synchrone, telle que, ou une API de flux`InvokeModel`, telle que`InvokeModelWithResponseStream`, pour obtenir des mises à jour progressives.

1. Lorsque des mises à jour sont reçues ou lorsque l'invocation est terminée, la fonction Lambda envoie des mises à jour via des mutations à AWS AppSync votre API, ce qui déclenche les abonnements.

1. Les événements d'abonnement sont envoyés en temps réel et reçus par votre client via le WebSocket.

![\[Schéma illustrant le flux de travail d'utilisation d'un AWS AppSync abonnement pour renvoyer des mises à jour à partir d'un modèle Amazon Bedrock.\]](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/bedrock-workflow.png)


## Référence de type
<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;
};
```