

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Espressioni di condizione
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-expressions"></a>

Quando modificate gli oggetti in DynamoDB utilizzando le operazioni`PutItem`, e `DeleteItem` DynamoDB`UpdateItem`, potete facoltativamente specificare un'espressione di condizione che controlli se la richiesta deve avere successo o meno, in base allo stato dell'oggetto già in DynamoDB prima dell'esecuzione dell'operazione.

La funzione AWS AppSync DynamoDB consente di specificare un'espressione di condizione `PutItem` negli `UpdateItem` oggetti `DeleteItem` e di richiedere una strategia da seguire se la condizione fallisce e l'oggetto non è stato aggiornato.

## Esempio 1
<a name="js-id19"></a>

Il seguente oggetto `PutItem` di richiesta non ha un'espressione di condizione. Di conseguenza, inserisce un elemento in DynamoDB anche se esiste già un elemento con la stessa chiave, sovrascrivendo così l'elemento esistente.

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

## Esempio 2
<a name="js-id20"></a>

L'`PutItem`oggetto seguente ha un'espressione di condizione che consente la riuscita dell'operazione solo se un elemento con la stessa chiave *non* esiste in 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)" }
  };
}
```

Per impostazione predefinita, se il controllo delle condizioni fallisce, la funzione AWS AppSync DynamoDB fornisce un errore per la mutazione.

Tuttavia, la funzione AWS AppSync DynamoDB offre alcune funzionalità aggiuntive per aiutare gli sviluppatori a gestire alcuni casi limite comuni:
+ Se AWS AppSync le funzioni di DynamoDB sono in grado di determinare che il valore corrente in DynamoDB corrisponde al risultato desiderato, considerano l'operazione come se fosse riuscita comunque.
+ Invece di restituire un errore, è possibile configurare la funzione per richiamare una funzione Lambda personalizzata per decidere come la funzione AWS AppSync DynamoDB deve gestire l'errore.

Questi sono descritti più dettagliatamente nella sezione [Gestione di un errore di controllo delle condizioni](#condition-check).

[Per ulteriori informazioni sulle espressioni delle condizioni di DynamoDB, consulta la documentazione di DynamoDB. ConditionExpressions ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)

## Specificare una condizione
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-specification"></a>

Gli oggetti `PutItem``UpdateItem`, e `DeleteItem` request consentono tutti di specificare una `condition` sezione facoltativa. Se omessa, non vengono eseguiti controlli di condizione. Se specificata, la condizione deve essere soddisfatta perché l'operazione abbia esito positivo.

Una sezione `condition` ha la seguente struttura:

```
type ConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
  equalsIgnore?: string[];
  consistentRead?: boolean;
  conditionalCheckFailedHandler?: {
    strategy: 'Custom' | 'Reject';
    lambdaArn?: string;
  };
};
```

I seguenti campi specificano la condizione:

** `expression` **  
L'espressione di aggiornamento in sé. Per ulteriori informazioni su come scrivere espressioni di condizione, consulta la documentazione di [ ConditionExpressions DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html). Questo campo deve essere specificato.

** `expressionNames` **  
Le sostituzioni per i segnaposto dell'attributo di espressione name, sotto forma di coppie chiave-valore. La chiave corrisponde a un segnaposto per il nome utilizzato nell'*espressione* e il valore deve essere una stringa corrispondente al nome dell'attributo dell'elemento in DynamoDB. Questo è un campo facoltativo in cui vanno riportate solo le sostituzioni per i segnaposto dell'attributo di espressione name utilizzate in*expression*.

** `expressionValues` **  
Le sostituzioni per i segnaposto del valore dell'attributo di espressione, sotto forma di coppie chiave-valore. La chiave corrisponde a un segnaposto per un valore utilizzato nell'espressione, mentre il valore deve essere un valore tipizzato. Per ulteriori informazioni su come specificare un «valore digitato», consulta [Type system](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request) (request mapping). Questo elemento deve essere specificato. Questo è un campo facoltativo in cui vanno riportate solo le sostituzioni per i segnaposto dell'attributo di espressione value utilizzate nell'espressione.

I campi rimanenti indicano alla funzione AWS AppSync DynamoDB come gestire un errore di controllo delle condizioni:

** `equalsIgnore` **  
Quando un controllo delle condizioni fallisce durante l'utilizzo dell'`PutItem`operazione, la funzione AWS AppSync DynamoDB confronta l'elemento attualmente in DynamoDB con l'elemento che ha cercato di scrivere. Se sono uguali, tratta l'operazione come se avesse avuto comunque esito positivo. È possibile utilizzare il `equalsIgnore` campo per specificare un elenco di attributi da AWS AppSync ignorare durante l'esecuzione del confronto. Ad esempio, se l'unica differenza era un `version` attributo, considera l'operazione come se fosse riuscita. Questo campo è facoltativo.

** `consistentRead` **  
Quando un controllo delle condizioni fallisce, AWS AppSync ottiene il valore corrente dell'elemento da DynamoDB utilizzando una lettura fortemente coerente. È possibile utilizzare questo campo per indicare alla funzione AWS AppSync DynamoDB di utilizzare invece una lettura alla fine coerente. Si tratta di un campo facoltativo, impostato di default su `true`.

** `conditionalCheckFailedHandler` **  
Questa sezione consente di specificare in che modo la funzione AWS AppSync DynamoDB tratta un errore di controllo delle condizioni dopo aver confrontato il valore corrente in DynamoDB con il risultato previsto. Questa sezione è facoltativa. Se omesso, la strategia predefinita è `Reject`.    
** `strategy` **  
La strategia adottata dalla AWS AppSync funzione DynamoDB dopo aver confrontato il valore corrente in DynamoDB con il risultato previsto. Questo campo è obbligatorio e ha i seguenti possibili valori:    
** `Reject` **  
La mutazione fallisce e viene aggiunto un errore alla risposta GraphQL.  
** `Custom` **  
La funzione AWS AppSync DynamoDB richiama una funzione Lambda personalizzata per decidere come gestire l'errore del controllo delle condizioni. Se `strategy` è impostato su `Custom`, il campo `lambdaArn` deve contenere l'ARN della funzione Lambda da invocare.  
** `lambdaArn` **  
L'ARN della funzione Lambda da richiamare che determina come la funzione DynamoDB deve gestire l'errore del controllo delle AWS AppSync condizioni. Questo campo deve essere specificato solo se `strategy` è impostato su `Custom`. Per ulteriori informazioni su come utilizzare questa funzionalità, consulta [Gestione](#condition-check) di un errore di controllo delle condizioni.

## Gestione di un errore di controllo delle condizioni
<a name="js-aws-appsync-resolver-reference-dynamodb-condition-handling"></a>

Quando un controllo delle condizioni fallisce, la AWS AppSync funzione DynamoDB può trasmettere l'errore per la mutazione e il valore corrente dell'oggetto utilizzando l'utilità. `util.appendError` Tuttavia, la funzione AWS AppSync DynamoDB offre alcune funzionalità aggiuntive per aiutare gli sviluppatori a gestire alcuni casi limite comuni:
+ Se AWS AppSync le funzioni di DynamoDB sono in grado di determinare che il valore corrente in DynamoDB corrisponde al risultato desiderato, considerano l'operazione come se fosse riuscita comunque.
+ Invece di restituire un errore, è possibile configurare la funzione per richiamare una funzione Lambda personalizzata per decidere come la funzione AWS AppSync DynamoDB deve gestire l'errore.

Il diagramma di questo processo è il seguente:

![\[Flowchart showing process for transforming requests with mutation attempts and value checks.\]](http://docs.aws.amazon.com/it_it/appsync/latest/devguide/images/DynamoDB-condition-check-failure-handling.png)


### Verifica del risultato desiderato
<a name="js-checking-for-the-desired-result"></a>

Quando il controllo delle condizioni fallisce, la funzione AWS AppSync DynamoDB esegue una richiesta `GetItem` DynamoDB per ottenere il valore corrente dell'elemento da DynamoDB. Per impostazione predefinita, si utilizza una lettura fortemente consistente, ma è possibile intervenire sulla configurazione utilizzando il campo `consistentRead` del blocco `condition` e confrontandolo con il risultato previsto:
+ Per l'`PutItem`operazione, la funzione AWS AppSync DynamoDB confronta il valore corrente con quello che ha tentato di scrivere, escludendo dal confronto tutti gli attributi elencati. `equalsIgnore` Se gli elementi sono uguali, considera l'operazione come riuscita e restituisce l'elemento recuperato da DynamoDB. In caso contrario, viene seguita la strategia configurata.

  Ad esempio, se l'oggetto della `PutItem` richiesta aveva il seguente aspetto:

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

  E la voce attualmente inclusa in DynamoDB fosse simile alla seguente:

  ```
  {
     "id" : { "S" : "1" },
     "name" : { "S" : "Steve" },
     "version" : { "N" : 8 }
  }
  ```

  La funzione AWS AppSync DynamoDB confronta l'elemento che ha provato a scrivere con il valore corrente, verifica che l'unica differenza è `version` il campo, ma poiché è configurata per ignorare `version` il campo, considera l'operazione come riuscita e restituisce l'elemento recuperato da DynamoDB.
+ Per l'`DeleteItem`operazione, la funzione AWS AppSync DynamoDB verifica che un elemento sia stato restituito da DynamoDB. Se nessuna voce è stata restituita, considera l'operazione riuscita. In caso contrario, viene seguita la strategia configurata.
+ Per l'`UpdateItem`operazione, la funzione AWS AppSync DynamoDB non dispone di informazioni sufficienti per determinare se l'elemento attualmente in DynamoDB corrisponde al risultato previsto e pertanto segue la strategia configurata.

Se lo stato corrente dell'oggetto in DynamoDB è diverso dal risultato previsto, la funzione AWS AppSync DynamoDB segue la strategia configurata, rifiutando la mutazione o richiamando una funzione Lambda per determinare cosa fare dopo.

### Seguendo la strategia di «rifiuto»
<a name="js-following-the-reject-strategy"></a>

Quando si segue la `Reject` strategia, la funzione AWS AppSync DynamoDB restituisce un errore per la mutazione.

Ad esempio, partendo dalla richiesta di mutazione seguente:

```
mutation {
    updatePerson(id: 1, name: "Steve", expectedVersion: 1) {
        Name
        theVersion
    }
}
```

Se l'elemento restituito da DynamoDB è simile al seguente:

```
{
   "id" : { "S" : "1" },
   "name" : { "S" : "Steve" },
   "version" : { "N" : 8 }
}
```

E il gestore della risposta alla funzione ha il seguente aspetto:

```
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 risposta GraphQL ha il seguente aspetto:

```
{
  "data": null,
  "errors": [
    {
      "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ)"
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      ...
    }
  ]
}
```

Inoltre, se i campi dell'oggetto restituito sono compilati da altri resolver in caso di successo della mutazione, tali campi non saranno risolti quando l'oggetto viene restituito nella sezione `error`.

### Seguendo la strategia «personalizzata»
<a name="js-following-the-custom-strategy"></a>

Quando si segue la `Custom` strategia, la funzione AWS AppSync DynamoDB richiama una funzione Lambda per decidere cosa fare dopo. La funzione Lambda sceglie una delle seguenti opzioni:
+  Rifiuto della mutazione (`reject`). Ciò indica alla funzione AWS AppSync DynamoDB di comportarsi come se lo `Reject` fosse la strategia configurata, restituendo un errore per la mutazione e il valore corrente dell'oggetto in DynamoDB come descritto nella sezione precedente.
+  Rifiuto della mutazione (`discard`). Ciò indica alla funzione AWS AppSync DynamoDB di ignorare silenziosamente l'errore del controllo delle condizioni e restituisce il valore in DynamoDB.
+  Rifiuto della mutazione (`retry`). Questo indica alla funzione AWS AppSync DynamoDB di ritentare la mutazione con un nuovo oggetto di richiesta.

 **La richiesta di invocazione Lambda**

La funzione AWS AppSync DynamoDB richiama la funzione Lambda specificata in. `lambdaArn` Utilizza lo stesso `service-role-arn` configurato per l'origine dati. Il payload dell'invocazione ha la seguente struttura:

```
{
    "arguments": { ... },
    "requestMapping": {... },
    "currentValue": { ... },
    "resolver": { ... },
    "identity": { ... }
}
```

I campi sono definiti come segue:

** `arguments` **  
Gli argomenti della mutazione GraphQL. È lo stesso degli argomenti disponibili per l'oggetto della richiesta in. `context.arguments`

** `requestMapping` **  
L'oggetto di richiesta per questa operazione.

** `currentValue` **  
Il valore corrente dell'oggetto in DynamoDB.

** `resolver` **  
Informazioni sul AWS AppSync resolver o sulla funzione.

** `identity` **  
Informazioni sul chiamante. Sono le stesse informazioni sull'identità disponibili per l'oggetto della richiesta in. `context.identity`

Un esempio completo di payload:

```
{
    "arguments": {
        "id": "1",
        "name": "Steve",
        "expectedVersion": 1
    },
    "requestMapping": {
        "version" : "2017-02-28",
        "operation" : "PutItem",
        "key" : {
           "id" : { "S" : "1" }
        },
        "attributeValues" : {
           "name" : { "S" : "Steve" },
           "version" : { "N" : 2 }
        },
        "condition" : {
           "expression" : "version = :expectedVersion",
           "expressionValues" : {
               ":expectedVersion" : { "N" : 1 }
           },
           "equalsIgnore": [ "version" ]
        }
    },
    "currentValue": {
        "id" : { "S" : "1" },
        "name" : { "S" : "Steve" },
        "version" : { "N" : 8 }
    },
    "resolver": {
        "tableName": "People",
        "awsRegion": "us-west-2",
        "parentType": "Mutation",
        "field": "updatePerson",
        "outputType": "Person"
    },
    "identity": {
        "accountId": "123456789012",
        "sourceIp": "x.x.x.x",
        "user": "AIDAAAAAAAAAAAAAAAAAA",
        "userArn": "arn:aws:iam::123456789012:user/appsync"
    }
}
```

 **La risposta all'invocazione Lambda** 

La funzione Lambda può ispezionare il payload di chiamata e applicare qualsiasi logica aziendale per decidere come la funzione DynamoDB deve gestire l'errore AWS AppSync . Sono disponibili tre opzioni per la gestione dell'errore nel controllo della condizione:
+  Rifiuto della mutazione (`reject`). Il payload di risposta per questa opzione deve avere questa struttura:

  ```
  {
      "action": "reject"
  }
  ```

  Ciò indica alla funzione AWS AppSync DynamoDB di comportarsi come se la strategia configurata lo `Reject` fosse, restituendo un errore per la mutazione e il valore corrente dell'oggetto in DynamoDB, come descritto nella sezione precedente.
+  Rifiuto della mutazione (`discard`). Il payload di risposta per questa opzione deve avere questa struttura:

  ```
  {
      "action": "discard"
  }
  ```

  Ciò indica alla funzione AWS AppSync DynamoDB di ignorare silenziosamente l'errore del controllo delle condizioni e restituisce il valore in DynamoDB.
+  Rifiuto della mutazione (`retry`). Il payload di risposta per questa opzione deve avere questa struttura:

  ```
  {
      "action": "retry",
      "retryMapping": { ... }
  }
  ```

  Questo indica alla funzione AWS AppSync DynamoDB di ritentare la mutazione con un nuovo oggetto di richiesta. La struttura della `retryMapping` sezione dipende dall'operazione DynamoDB ed è un sottoinsieme dell'oggetto di richiesta completo per tale operazione.

  Per `PutItem`, la sezione `retryMapping` ha la seguente struttura. Per una descrizione del `attributeValues` campo, vedere. [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
      }
  }
  ```

  Per `UpdateItem`, la sezione `retryMapping` ha la seguente struttura. Per una descrizione della `update` sezione, vedere [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
      }
  }
  ```

  Per `DeleteItem`, la sezione `retryMapping` ha la seguente struttura.

  ```
  {
      "condition": {
          "consistentRead" = true
      }
  }
  ```

  Non c'è modo di specificare operazioni o chiavi diverse su cui lavorare. La funzione AWS AppSync DynamoDB consente solo nuovi tentativi della stessa operazione sullo stesso oggetto. Inoltre, la sezione `condition` non consente di specificare un valore per `conditionalCheckFailedHandler`. Se il nuovo tentativo fallisce, la funzione AWS AppSync DynamoDB segue la strategia. `Reject`

Ecco un esempio di funzione Lambda per far fronte a una richiesta `PutItem` non riuscita. La logica di business osserva l'autore della chiamata. Se è stata effettuata da`jeffTheAdmin`, riprova la richiesta, aggiornando l'`version`and `expectedVersion` dall'elemento attualmente in DynamoDB. Altrimenti rifiuta la mutazione.

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