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à.
Creazione di una semplice applicazione post utilizzando i resolver DynamoDB JavaScript
In questo tutorial, importerai le tue tabelle Amazon DynamoDB e le AWS AppSync collegherai per creare un GraphQL API completamente funzionale JavaScript utilizzando resolver di pipeline che puoi sfruttare nella tua applicazione.
Utilizzerai la AWS AppSync console per effettuare il provisioning delle tue risorse Amazon DynamoDB, creare i tuoi resolver e collegarli alle tue fonti di dati. Potrai anche leggere e scrivere sul tuo database Amazon DynamoDB tramite istruzioni GraphQL e sottoscrivere dati in tempo reale.
Esistono passaggi specifici che devono essere completati per tradurre le istruzioni GraphQL nelle operazioni di Amazon DynamoDB e per ritradurre le risposte in GraphQL. Questo tutorial descrive il processo di configurazione attraverso diversi scenari e modelli di accesso ai dati reali.
Creare il tuo GraphQL API
Per creare un GraphQL API in AWS AppSync
-
Apri la AppSync console e scegli Crea API.
-
Seleziona Design da zero e scegli Avanti.
-
Dai un nome al tuo API
PostTutorialAPI
, quindi scegli Avanti. Passa alla pagina di revisione mantenendo le altre opzioni impostate sui valori predefiniti e scegliCreate
.
La AWS AppSync console crea un nuovo GraphQL API per te. Per impostazione predefinita, utilizza la modalità di autenticazione a API chiave. Puoi usare la console per configurare il resto di GraphQL API ed eseguire query su di esso per il resto di questo tutorial.
Definizione di un post di base API
Ora che hai GraphQLAPI, puoi configurare uno schema di base che consenta la creazione, il recupero e l'eliminazione di base dei dati post.
Per aggiungere dati allo schema
-
Nel tuoAPI, scegli la scheda Schema.
-
Creeremo uno schema che definisce un
Post
tipo e un'operazioneaddPost
per aggiungere e ottenerePost
oggetti. Nel riquadro Schema, sostituisci il contenuto con il seguente codice:schema { query: Query mutation: Mutation } type Query { getPost(id: ID): Post } type Mutation { addPost( id: ID! author: String! title: String! content: String! url: String! ): Post! } type Post { id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! }
-
Scegli Save Scheme (Salva schema).
Configurazione della tabella Amazon DynamoDB
La AWS AppSync console può aiutarti a fornire le AWS risorse necessarie per archiviare le tue risorse in una tabella Amazon DynamoDB. In questo passaggio, creerai una tabella Amazon DynamoDB per archiviare i tuoi post. Inoltre, configurerai un indice secondario che utilizzeremo in seguito.
Per creare la tua tabella Amazon DynamoDB
-
Nella pagina Schema, scegli Crea risorse.
-
Scegli Usa tipo esistente, quindi scegli il
Post
tipo. -
Nella sezione Indici aggiuntivi, scegli Aggiungi indice.
-
Assegna un nome all'indice.
author-index
-
Imposta
Primary key
aauthor
e laSort
chiave aNone
. -
Disabilita la generazione automatica di GraphQL. In questo esempio, creeremo noi stessi il resolver.
-
Scegli Create (Crea) .
Ora hai una nuova fonte di dati chiamataPostTable
, che puoi vedere visitando Fonti di dati nella scheda laterale. Utilizzerai questa fonte di dati per collegare le tue query e mutazioni alla tua tabella Amazon DynamoDB.
Configurazione di un addPost resolver (Amazon DynamoDB) PutItem
Ora che conosci AWS AppSync la tabella Amazon DynamoDB, puoi collegarla a singole query e mutazioni definendo i resolver. Il primo resolver che crei è il resolver di addPost
pipeline utilizzato JavaScript, che ti consente di creare un post nella tua tabella Amazon DynamoDB. Un risolutore di pipeline ha i seguenti componenti:
-
Posizione nello schema GraphQL per collegare il resolver. In questo caso, stai configurando un resolver nel campo
createPost
nel tipoMutation
. Questo resolver verrà richiamato quando il chiamante chiama mutation.{ addPost(...){...} }
-
Origine dati da usare per il resolver. In questo caso, si desidera utilizzare l'origine dati DynamoDB definita in precedenza, in modo da poter aggiungere voci nella tabella DynamoDB.
post-table-for-tutorial
-
Il gestore delle richieste. Il gestore delle richieste è una funzione che gestisce la richiesta in entrata dal chiamante e la traduce in istruzioni da AWS AppSync eseguire su DynamoDB.
-
Il gestore delle risposte. Il compito del gestore delle risposte è gestire la risposta da DynamoDB e tradurla nuovamente in qualcosa che GraphQL si aspetta. Questo è utile se la forma dei dati in DynamoDB è diversa rispetto al tipo
Post
in GraphQL, ma in questo caso hanno la stessa forma e di conseguenza puoi semplicemente passare i dati.
Per configurare il resolver
-
Nel tuoAPI, scegli la scheda Schema.
-
Nel riquadro Resolver, trova il
addPost
campo sotto ilMutation
tipo, quindi scegli Allega. -
Scegli la tua fonte di dati, quindi scegli Crea.
-
Nel tuo editor di codice, sostituisci il codice con questo frammento:
import { util } from '@aws-appsync/utils' import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { const item = { ...ctx.arguments, ups: 1, downs: 0, version: 1 } const key = { id: ctx.args.id ?? util.autoId() } return ddb.put({ key, item }) } export function response(ctx) { return ctx.result }
-
Seleziona Salva.
Nota
In questo codice, si utilizzano gli utils del modulo DynamoDB che consentono di creare facilmente richieste DynamoDB.
AWS AppSync viene fornito con un'utilità per la generazione automatica di ID chiamatautil.autoId()
, che viene utilizzata per generare un ID per il nuovo post. Se non specifichi un ID, l'utilità lo genererà automaticamente per te.
const key = { id: ctx.args.id ?? util.autoId() }
Per ulteriori informazioni sulle utilità disponibili per JavaScript, consulta Funzionalità JavaScript di runtime per resolver e funzioni.
Chiamali per aggiungere un post API
Ora che il resolver è stato configurato, AWS AppSync puoi tradurre una addPost
mutazione in entrata in un'operazione Amazon DynamoDB. PutItem
Puoi ora eseguire una mutazione per inserire contenuto nella tabella.
Per eseguire l'operazione
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Query, aggiungi la seguente mutazione:
mutation addPost { addPost( id: 123, author: "AUTHORNAME" title: "Our first post!" content: "This is our first post." url: "https://aws.amazon.com/appsync/" ) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
addPost
I risultati del post appena creato dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:{ "data": { "addPost": { "id": "123", "author": "AUTHORNAME", "title": "Our first post!", "content": "This is our first post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
La seguente spiegazione mostra cosa è successo:
-
AWS AppSync ha ricevuto una richiesta di
addPost
mutazione. -
AWS AppSync esegue il gestore delle richieste del resolver. La
ddb.put
funzione crea unaPutItem
richiesta simile alla seguente:{ operation: 'PutItem', key: { id: { S: '123' } }, attributeValues: { downs: { N: 0 }, author: { S: 'AUTHORNAME' }, ups: { N: 1 }, title: { S: 'Our first post!' }, version: { N: 1 }, content: { S: 'This is our first post.' }, url: { S: 'https://aws.amazon.com/appsync/' } } }
-
AWS AppSync utilizza questo valore per generare ed eseguire una richiesta Amazon
PutItem
DynamoDB. -
AWS AppSync ha preso i risultati della
PutItem
richiesta e li ha riconvertiti in tipi GraphQL.{ "id" : "123", "author": "AUTHORNAME", "title": "Our first post!", "content": "This is our first post.", "url": "https://aws.amazon.com/appsync/", "ups" : 1, "downs" : 0, "version" : 1 }
-
Il gestore della risposta restituisce immediatamente il risultato ()
return ctx.result
. -
Il risultato finale è visibile nella risposta GraphQL.
Configurazione del getPost resolver (Amazon DynamoDB) GetItem
Ora che sei in grado di aggiungere dati alla tabella Amazon DynamoDB, devi configurare getPost
la query in modo che possa recuperare i dati dalla tabella. A questo scopo, devi configurare un altro resolver.
Per aggiungere il tuo resolver
-
Nel tuoAPI, scegli la scheda Schema.
-
Nel riquadro Resolver a destra, trova il
getPost
campo relativo alQuery
tipo, quindi scegli Allega. -
Scegli la tua fonte di dati, quindi scegli Crea.
-
Nell'editor di codice, sostituisci il codice con questo frammento:
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
-
Salva il resolver.
Nota
In questo resolver, utilizziamo un'espressione della funzione freccia per il gestore delle risposte.
Chiamali API per ricevere un post
Ora che il resolver è stato configurato, AWS AppSync sa come tradurre una getPost
query in entrata in un'operazione Amazon DynamoDB. GetItem
Puoi ora eseguire una query per recuperare il post creato prima.
Per eseguire la tua query
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Query, aggiungi il codice seguente e usa l'id che hai copiato dopo aver creato il post:
query getPost { getPost(id: "123") { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
getPost
I risultati del post appena creato dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. -
Il post recuperato da Amazon DynamoDB dovrebbe apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:
{ "data": { "getPost": { "id": "123", "author": "AUTHORNAME", "title": "Our first post!", "content": "This is our first post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
In alternativa, prendi il seguente esempio:
query getPost { getPost(id: "123") { id author title } }
Se la tua getPost
query richiede solo ilid
, e author
title
, puoi modificare la funzione di richiesta per utilizzare le espressioni di proiezione per specificare solo gli attributi che desideri dalla tua tabella DynamoDB per evitare trasferimenti di dati non necessari da DynamoDB a. AWS AppSync Ad esempio, la funzione di richiesta può essere simile allo snippet riportato di seguito:
import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { return ddb.get({ key: { id: ctx.args.id }, projection: ['author', 'id', 'title'], }) } export const response = (ctx) => ctx.result
Puoi anche usare un selectionSetListwith getPost
per rappresentare: expression
import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { const projection = ctx.info.selectionSetList.map((field) => field.replace('/', '.')) return ddb.get({ key: { id: ctx.args.id }, projection }) } export const response = (ctx) => ctx.result
Creare una updatePost mutazione (Amazon DynamoDB UpdateItem)
Finora, puoi creare e recuperare Post
oggetti in Amazon DynamoDB. Successivamente, imposterai una nuova mutazione per aggiornare un oggetto. Rispetto alla addPost
mutazione che richiede la specificazione di tutti i campi, questa mutazione consente di specificare solo i campi che si desidera modificare. Ha inoltre introdotto un nuovo expectedVersion
argomento che consente di specificare la versione che si desidera modificare. Imposterete una condizione che assicurerà che stiate modificando la versione più recente dell'oggetto. Potrai farlo utilizzando UpdateItem
Amazon DynamoDB operation.sc
Per aggiornare il resolver
-
Nel tuoAPI, scegli la scheda Schema.
-
Nel riquadro Schema, modificare il tipo
Mutation
per aggiungere una nuova mutazioneupdatePost
come segue:type Mutation { updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( id: ID author: String! title: String! content: String! url: String! ): Post! }
-
Scegli Save Scheme (Salva schema).
-
Nel riquadro Resolver a destra, trova il
updatePost
campo appena creato relativo alMutation
tipo, quindi scegli Allega. Crea il tuo nuovo resolver usando lo snippet qui sotto:import { util } from '@aws-appsync/utils'; import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { id, expectedVersion, ...rest } = ctx.args; const values = Object.entries(rest).reduce((obj, [key, value]) => { obj[key] = value ?? ddb.operations.remove(); return obj; }, {}); return ddb.update({ key: { id }, condition: { version: { eq: expectedVersion } }, update: { ...values, version: ddb.operations.increment(1) }, }); } export function response(ctx) { const { error, result } = ctx; if (error) { util.appendError(error.message, error.type); } return result;
-
Salva tutte le modifiche che hai apportato.
Questo resolver viene utilizzato ddb.update
per creare una richiesta Amazon DynamoDB. UpdateItem
Invece di scrivere l'intero articolo, stai semplicemente chiedendo ad Amazon DynamoDB di aggiornare determinati attributi. Questa operazione viene eseguita utilizzando le espressioni di aggiornamento di Amazon DynamoDB.
La ddb.update
funzione accetta una chiave e un oggetto di aggiornamento come argomenti. Quindi, controllate i valori degli argomenti in entrata. Quando un valore è impostato sunull
, utilizzate l'operazione remove
DynamoDB per segnalare che il valore deve essere rimosso dall'elemento DynamoDB.
C'è anche una nuova sezione. condition
Un'espressione di condizione consente di indicare AWS AppSync ad Amazon DynamoDB se la richiesta deve avere successo o meno in base allo stato dell'oggetto già in Amazon DynamoDB prima dell'esecuzione dell'operazione. In questo caso, vuoi che la UpdateItem
richiesta abbia esito positivo solo se il version
campo dell'elemento attualmente in Amazon DynamoDB corrisponde expectedVersion
esattamente all'argomento. Quando l'elemento viene aggiornato, vogliamo incrementare il valore di. version
Questo è facile da fare con la funzione increment
operativa.
Per ulteriori informazioni sulle espressioni condizionali, consulta la documentazione sulle espressioni di condizione.
Per maggiori informazioni sulla UpdateItem
richiesta, consulta la UpdateItemdocumentazione e la documentazione del modulo DynamoDB.
Per ulteriori informazioni su come scrivere espressioni di aggiornamento, consulta la documentazione di UpdateExpressionsDynamoDB.
Chiamali API per aggiornare un post
Proviamo ad aggiornare l'Post
oggetto con il nuovo resolver.
Per aggiornare l'oggetto
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Interrogazioni, aggiungi la seguente mutazione. Dovrai anche aggiornare l'
id
argomento al valore annotato in precedenza:mutation updatePost { updatePost( id:123 title: "An empty story" content: null expectedVersion: 1 ) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
updatePost
. -
Il post aggiornato in Amazon DynamoDB dovrebbe apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:
{ "data": { "updatePost": { "id": "123", "author": "A new author", "title": "An empty story", "content": null, "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 2 } } }
In questa richiesta, hai chiesto ad Amazon DynamoDB di aggiornare title
solo i campi AWS AppSync and. content
Tutti gli altri campi sono stati lasciati soli (a parte l'incremento del version
campo). Hai impostato l'title
attributo su un nuovo valore e rimosso l'content
attributo dal post. I campi author
, url
, ups
e downs
sono stati lasciati invariati. Prova a eseguire nuovamente la richiesta di mutazione lasciando la richiesta esattamente com'è. Noterai una risposta simile alla seguente:
{ "data": { "updatePost": null }, "errors": [ { "path": [ "updatePost" ], "data": null, "errorType": "DynamoDB:ConditionalCheckFailedException", "errorInfo": null, "locations": [ { "line": 2, "column": 3, "sourceName": null } ], "message": "The conditional request failed (Service: DynamoDb, Status Code: 400, Request ID: 1RR3QN5F35CS8IV5VR4OQO9NNBVV4KQNSO5AEMVJF66Q9ASUAAJG)" } ] }
La richiesta fallisce perché l'espressione della condizione restituisce: false
-
La prima volta che hai eseguito la richiesta, il valore del
version
campo del post in Amazon DynamoDB1
era corrispondente all'argomento.expectedVersion
La richiesta è riuscita, il che significa che ilversion
campo è stato incrementato in Amazon DynamoDB a.2
-
La seconda volta che hai eseguito la richiesta, il valore del
version
campo del post in Amazon DynamoDB2
era, che non corrispondeva all'argomento.expectedVersion
Questo modello viene in genere chiamato blocco ottimistico.
Crea mutazioni di voto (Amazon DynamoDB UpdateItem)
Il Post
tipo contiene downs
campi per consentire la registrazione di voti positivi ups
e negativi. Tuttavia, in questo momento, API non ci permette di fare nulla con loro. Aggiungiamo una mutazione per consentirci di votare positivamente e negativamente i post.
Per aggiungere la tua mutazione
-
Nella tuaAPI, scegli la scheda Schema.
-
Nel riquadro Schema, modifica il
Mutation
tipo e aggiungi l'DIRECTION
enum per aggiungere nuove mutazioni di voto:type Mutation { vote(id: ID!, direction: DIRECTION!): Post updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( id: ID, author: String!, title: String!, content: String!, url: String! ): Post! } enum DIRECTION { UP DOWN }
-
Scegli Save Scheme (Salva schema).
-
Nel riquadro Resolver a destra, individuate il
vote
campo appena creato relativo alMutation
tipo, quindi scegliete Allega. Crea un nuovo resolver creando e sostituendo il codice con il seguente frammento:import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const field = ctx.args.direction === 'UP' ? 'ups' : 'downs'; return ddb.update({ key: { id: ctx.args.id }, update: { [field]: ddb.operations.increment(1), version: ddb.operations.increment(1), }, }); } export const response = (ctx) => ctx.result;
-
Salva le modifiche apportate.
Chiamali API per dare un voto positivo o negativo a un post
Ora che i nuovi resolver sono stati configurati, AWS AppSync sa come tradurre una modifica upvotePost
o una downvote
mutazione in entrata in un'operazione Amazon DynamoDB. UpdateItem
Ora puoi eseguire mutazioni per assegnare voti positivi e voti negativi al post creato prima.
Per eseguire la tua mutazione
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Interrogazioni, aggiungi la seguente mutazione. Dovrai anche aggiornare l'
id
argomento al valore annotato in precedenza:mutation votePost { vote(id:123, direction: UP) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
votePost
. -
Il post aggiornato in Amazon DynamoDB dovrebbe apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:
{ "data": { "vote": { "id": "123", "author": "A new author", "title": "An empty story", "content": null, "url": "https://aws.amazon.com/appsync/", "ups": 6, "downs": 0, "version": 4 } } }
-
Scegli Esegui ancora un paio di volte. Dovresti vedere i
version
campiups
and incrementare1
ogni volta che esegui la query. -
Modificate la query per chiamarla con un'altra
DIRECTION
.mutation votePost { vote(id:123, direction: DOWN) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante di riproduzione arancione), quindi scegli
votePost
.Questa volta, dovresti vedere i
version
campidowns
and incrementarsi1
ogni volta che esegui la query.
Configurazione di un deletePost resolver (Amazon DynamoDB) DeleteItem
Successivamente, ti consigliamo di creare una mutazione per eliminare un post. A tale scopo, utilizzerai l'operazione DeleteItem
Amazon DynamoDB.
Per aggiungere la tua mutazione
-
Nel tuo schema, scegli la scheda Schema.
-
Nel riquadro Schema, modifica il
Mutation
tipo per aggiungere una nuovadeletePost
mutazione:type Mutation { deletePost(id: ID!, expectedVersion: Int): Post vote(id: ID!, direction: DIRECTION!): Post updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( id: ID author: String!, title: String!, content: String!, url: String! ): Post! }
-
Questa volta hai reso il
expectedVersion
campo facoltativo. Quindi, scegli Salva schema. -
Nel riquadro Resolver a destra, trova il
delete
campo appena creato nelMutation
tipo, quindi scegli Allega. Crea un nuovo resolver utilizzando il seguente codice:import { util } from '@aws-appsync/utils' import { util } from '@aws-appsync/utils'; import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { let condition = null; if (ctx.args.expectedVersion) { condition = { or: [ { id: { attributeExists: false } }, { version: { eq: ctx.args.expectedVersion } }, ], }; } return ddb.remove({ key: { id: ctx.args.id }, condition }); } export function response(ctx) { const { error, result } = ctx; if (error) { util.appendError(error.message, error.type); } return result; }
Nota
L'
expectedVersion
argomento è un argomento facoltativo. Se il chiamante imposta unexpectedVersion
argomento nella richiesta, il gestore della richiesta aggiunge una condizione che consente allaDeleteItem
richiesta di avere successo solo se l'elemento è già stato eliminato o se l'version
attributo del post in Amazon DynamoDB corrisponde esattamente a.expectedVersion
Se non viene inserito, nessuna espressione di condizione viene specificata nella richiestaDeleteItem
. Ha successo indipendentemente dal valore o dall'esistenzaversion
o meno dell'elemento in Amazon DynamoDB.Anche se stai eliminando un articolo, puoi restituire l'elemento che è stato eliminato, se non lo era già.
Per maggiori informazioni sulla DeleteItem
richiesta, consulta la DeleteItemdocumentazione.
Chiamali API per eliminare un post
Ora che il resolver è stato configurato, AWS AppSync sa come tradurre una delete
mutazione in entrata in un'operazione Amazon DynamoDB. DeleteItem
Puoi ora eseguire una mutazione per eliminare qualcosa nella tabella.
Per eseguire la tua mutazione
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Interrogazioni, aggiungi la seguente mutazione. Dovrai anche aggiornare l'
id
argomento al valore annotato in precedenza:mutation deletePost { deletePost(id:123) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
deletePost
. -
Il post viene eliminato da Amazon DynamoDB. Tieni presente che AWS AppSync restituisce il valore dell'elemento che è stato eliminato da Amazon DynamoDB, che dovrebbe apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:
{ "data": { "deletePost": { "id": "123", "author": "A new author", "title": "An empty story", "content": null, "url": "https://aws.amazon.com/appsync/", "ups": 6, "downs": 4, "version": 12 } } }
-
Il valore viene restituito solo se questa chiamata a
deletePost
è quella che lo elimina effettivamente da Amazon DynamoDB. Scegli nuovamente Esegui. -
La chiamata riesce ancora, ma non viene restituito alcun valore:
{ "data": { "deletePost": null } }
-
Ora, proviamo a eliminare un post, ma questa volta specificando un.
expectedValue
Innanzitutto, devi creare un nuovo post perché hai appena eliminato quello con cui hai lavorato finora. -
Nel riquadro Query, aggiungi la seguente mutazione:
mutation addPost { addPost( id:123 author: "AUTHORNAME" title: "Our second post!" content: "A new post." url: "https://aws.amazon.com/appsync/" ) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
addPost
-
I risultati del post appena creato dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. Registra
id
l'oggetto appena creato perché ti servirà in un attimo. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:{ "data": { "addPost": { "id": "123", "author": "AUTHORNAME", "title": "Our second post!", "content": "A new post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
-
Ora, proviamo a eliminare quel post con un valore illegale per expectedVersion. Nel riquadro Query, aggiungi la seguente mutazione. Dovrai anche aggiornare l'
id
argomento al valore annotato in precedenza:mutation deletePost { deletePost( id:123 expectedVersion: 9999 ) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
deletePost
. Viene restituito il seguente risultato:{ "data": { "deletePost": null }, "errors": [ { "path": [ "deletePost" ], "data": null, "errorType": "DynamoDB:ConditionalCheckFailedException", "errorInfo": null, "locations": [ { "line": 2, "column": 3, "sourceName": null } ], "message": "The conditional request failed (Service: DynamoDb, Status Code: 400, Request ID: 7083O037M1FTFRK038A4CI9H43VV4KQNSO5AEMVJF66Q9ASUAAJG)" } ] }
-
La richiesta non è riuscita perché l'espressione della condizione restituisce.
false
Il valoreversion
del post in Amazon DynamoDB non corrisponde a quello specificatoexpectedValue
negli argomenti. Il valore corrente dell'oggetto viene restituito nel campodata
nella sezioneerrors
della risposta GraphQL. Riprova la richiesta, correggendo il valore diexpectedVersion
:mutation deletePost { deletePost( id:123 expectedVersion: 1 ) { id author title content url ups downs version } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
deletePost
Questa volta la richiesta ha esito positivo e viene restituito il valore che è stato eliminato da Amazon DynamoDB:
{ "data": { "deletePost": { "id": "123", "author": "AUTHORNAME", "title": "Our second post!", "content": "A new post.", "url": "https://aws.amazon.com/appsync/", "ups": 1, "downs": 0, "version": 1 } } }
-
Scegli nuovamente Esegui. La chiamata riesce ancora, ma questa volta non viene restituito alcun valore perché il post è già stato eliminato in Amazon DynamoDB.
{ "data": { "deletePost": null } }
Configurazione di un allPost resolver (Amazon DynamoDB Scan)
Finora, API è utile solo se conosci ogni post che vuoi guardare. id
Aggiungiamo ora un nuovo resolver che restituisce tutti i post nella tabella.
Per aggiungere la tua mutazione
-
Nella tuaAPI, scegli la scheda Schema.
-
Nel riquadro Schema, modificare il tipo
Query
per aggiungere una nuova queryallPost
come segue:type Query { allPost(limit: Int, nextToken: String): PaginatedPosts! getPost(id: ID): Post }
-
Aggiungi un nuovo tipo
PaginationPosts
:type PaginatedPosts { posts: [Post!]! nextToken: String }
-
Scegli Save Scheme (Salva schema).
-
Nel riquadro Resolver a destra, trova il
allPost
campo appena creato nelQuery
tipo, quindi scegli Allega. Crea un nuovo resolver con il seguente codice:import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { limit = 20, nextToken } = ctx.arguments; return ddb.scan({ limit, nextToken }); } export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
Il gestore delle richieste di questo resolver prevede due argomenti opzionali:
-
limit
- Speciifica il numero massimo di elementi da restituire in una singola chiamata. -
nextToken
- Utilizzato per recuperare il prossimo set di risultati (mostreremo da dovenextToken
proviene il valore di in seguito).
-
-
Salva tutte le modifiche apportate al tuo resolver.
Per ulteriori informazioni sulla Scan
richiesta, consulta la documentazione di riferimento di Scan.
Chiama il API per scansionare tutti i post
Ora che il resolver è stato configurato, AWS AppSync sa come tradurre una allPost
query in entrata in un'operazione Amazon DynamoDB. Scan
Puoi ora analizzare la tabella per recuperare tutti i post. Prima di provare, devi immettere nella tabella alcuni dati, perché hai eliminato tutti quelli usati finora.
Per aggiungere e interrogare dati
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Query, aggiungi la seguente mutazione:
mutation addPost { post1: addPost(id:1 author: "AUTHORNAME" title: "A series of posts, Volume 1" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post2: addPost(id:2 author: "AUTHORNAME" title: "A series of posts, Volume 2" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post3: addPost(id:3 author: "AUTHORNAME" title: "A series of posts, Volume 3" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post4: addPost(id:4 author: "AUTHORNAME" title: "A series of posts, Volume 4" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post5: addPost(id:5 author: "AUTHORNAME" title: "A series of posts, Volume 5" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post6: addPost(id:6 author: "AUTHORNAME" title: "A series of posts, Volume 6" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post7: addPost(id:7 author: "AUTHORNAME" title: "A series of posts, Volume 7" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post8: addPost(id:8 author: "AUTHORNAME" title: "A series of posts, Volume 8" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } post9: addPost(id:9 author: "AUTHORNAME" title: "A series of posts, Volume 9" content: "Some content" url: "https://aws.amazon.com/appsync/" ) { title } }
-
Scegli Esegui (il pulsante di riproduzione arancione).
-
Analizziamo ora la tabella, restituendo cinque risultati per volta. Nel riquadro Interrogazioni, aggiungi la seguente interrogazione:
query allPost { allPost(limit: 5) { posts { id title } nextToken } }
-
Scegli Esegui (il pulsante di riproduzione arancione), quindi scegli
allPost
.I primi cinque post dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:
{ "data": { "allPost": { "posts": [ { "id": "5", "title": "A series of posts, Volume 5" }, { "id": "1", "title": "A series of posts, Volume 1" }, { "id": "6", "title": "A series of posts, Volume 6" }, { "id": "9", "title": "A series of posts, Volume 9" }, { "id": "7", "title": "A series of posts, Volume 7" } ], "nextToken": "<token>" } } }
-
Hai ricevuto cinque risultati e uno
nextToken
che puoi utilizzare per ottenere il prossimo set di risultati. Aggiornare la queryallPost
in modo da includerenextToken
dal set precedente di risultati:query allPost { allPost( limit: 5 nextToken: "<token>" ) { posts { id author } nextToken } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
allPost
.I quattro post rimanenti dovrebbero apparire nel riquadro Risultati a destra del riquadro Interrogazioni. Non c'è nessuno
nextToken
in questo set di risultati perché hai sfogliato tutti e nove i post senza che ne rimanga nessuno. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:{ "data": { "allPost": { "posts": [ { "id": "2", "title": "A series of posts, Volume 2" }, { "id": "3", "title": "A series of posts, Volume 3" }, { "id": "4", "title": "A series of posts, Volume 4" }, { "id": "8", "title": "A series of posts, Volume 8" } ], "nextToken": null } } }
Configurazione di un allPostsBy Author resolver (Amazon DynamoDB Query)
Oltre a scansionare Amazon DynamoDB per tutti i post, puoi anche interrogare Amazon DynamoDB per recuperare i post creati da un autore specifico. La tabella Amazon DynamoDB creata in precedenza contiene già GlobalSecondaryIndex
una author-index
chiamata che puoi usare con un'operazione Amazon DynamoDB per recuperare tutti i Query
post creati da un autore specifico.
Per aggiungere la tua query
-
Nella tuaAPI, scegli la scheda Schema.
-
Nel riquadro Schema, modificare il tipo
Query
per aggiungere una nuova queryallPostsByAuthor
come segue:type Query { allPostsByAuthor(author: String!, limit: Int, nextToken: String): PaginatedPosts! allPost(limit: Int, nextToken: String): PaginatedPosts! getPost(id: ID): Post }
Tieni presente che viene utilizzato lo stesso
PaginatedPosts
tipo che hai usato con laallPost
query. -
Scegli Save Scheme (Salva schema).
-
Nel riquadro Resolver a destra, individuate il
allPostsByAuthor
campo appena creato relativo alQuery
tipo, quindi scegliete Allega. Crea un resolver usando lo snippet seguente:import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { limit = 20, nextToken, author } = ctx.arguments; return ddb.query({ index: 'author-index', query: { author: { eq: author } }, limit, nextToken, }); } export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
Come il
allPost
resolver, questo resolver ha due argomenti opzionali:-
limit
- Speciifica il numero massimo di elementi da restituire in una singola chiamata. -
nextToken
- Recupera il successivo set di risultati (il valore dinextToken
può essere ottenuto da una chiamata precedente).
-
-
Salva tutte le modifiche apportate al tuo resolver.
Per ulteriori informazioni sulla Query
richiesta, consulta la documentazione di riferimento di Query.
Chiama il API per interrogare tutti i post per autore
Ora che il resolver è stato configurato, AWS AppSync sa come tradurre una allPostsByAuthor
mutazione in entrata in un'operazione DynamoDB sull'indice. Query
author-index
Puoi ora eseguire una query sulla tabella per recuperare tutti i post di un autore specifico.
Prima di questo, tuttavia, riempiamo la tabella con altri post, perché finora tutti i post hanno lo stesso autore.
Per aggiungere dati e interrogare
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Query, aggiungi la seguente mutazione:
mutation addPost { post1: addPost(id:10 author: "Nadia" title: "The cutest dog in the world" content: "So cute. So very, very cute." url: "https://aws.amazon.com/appsync/" ) { author, title } post2: addPost(id:11 author: "Nadia" title: "Did you know...?" content: "AppSync works offline?" url: "https://aws.amazon.com/appsync/" ) { author, title } post3: addPost(id:12 author: "Steve" title: "I like GraphQL" content: "It's great" url: "https://aws.amazon.com/appsync/" ) { author, title } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
addPost
-
Esegui ora la query sulla tabella, per restituire tutti i post il cui autore è
Nadia
. Nel riquadro Interrogazioni, aggiungi la seguente interrogazione:query allPostsByAuthor { allPostsByAuthor(author: "Nadia") { posts { id title } nextToken } }
-
Scegli Esegui (il pulsante di riproduzione arancione), quindi scegli
allPostsByAuthor
. Tutti i post creati daNadia
dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:{ "data": { "allPostsByAuthor": { "posts": [ { "id": "10", "title": "The cutest dog in the world" }, { "id": "11", "title": "Did you know...?" } ], "nextToken": null } } }
-
La paginazione funziona per
Query
esattamente come perScan
. Ad esempio, cerchiamo tutti i post diAUTHORNAME
, restituendone cinque per volta. -
Nel riquadro Interrogazioni, aggiungi la seguente query:
query allPostsByAuthor { allPostsByAuthor( author: "AUTHORNAME" limit: 5 ) { posts { id title } nextToken } }
-
Scegli Esegui (il pulsante di riproduzione arancione), quindi scegli
allPostsByAuthor
. Tutti i post creati daAUTHORNAME
dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:{ "data": { "allPostsByAuthor": { "posts": [ { "id": "6", "title": "A series of posts, Volume 6" }, { "id": "4", "title": "A series of posts, Volume 4" }, { "id": "2", "title": "A series of posts, Volume 2" }, { "id": "7", "title": "A series of posts, Volume 7" }, { "id": "1", "title": "A series of posts, Volume 1" } ], "nextToken": "<token>" } } }
-
Aggiornare l'argomento
nextToken
con il valore restituito dalla query precedente, come segue:query allPostsByAuthor { allPostsByAuthor( author: "AUTHORNAME" limit: 5 nextToken: "<token>" ) { posts { id title } nextToken } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
allPostsByAuthor
I post rimanenti creati daAUTHORNAME
dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:{ "data": { "allPostsByAuthor": { "posts": [ { "id": "8", "title": "A series of posts, Volume 8" }, { "id": "5", "title": "A series of posts, Volume 5" }, { "id": "3", "title": "A series of posts, Volume 3" }, { "id": "9", "title": "A series of posts, Volume 9" } ], "nextToken": null } } }
Uso dei set
Fino a questo punto, il Post
tipo era un oggetto chiave/valore piatto. Puoi anche modellare oggetti complessi con il tuo resolver, come set, elenchi e mappe. Aggiorniamo ora il tipo Post
perché includa tag. Un post può avere zero o più tag, che vengono archiviati in DynamoDB come set di stringhe. Dobbiamo anche configurare alcune mutazioni per aggiungere e rimuovere tag e una query per analizzare i post con un tag specifico.
Per configurare i tuoi dati
-
Nella tuaAPI, scegli la scheda Schema.
-
Nel riquadro Schema, modificare il tipo
Post
per aggiungere un nuovo campotags
come segue:type Post { id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! tags: [String!] }
-
Nel riquadro Schema, modificare il tipo
Query
per aggiungere una nuova queryallPostsByTag
come segue:type Query { allPostsByTag(tag: String!, limit: Int, nextToken: String): PaginatedPosts! allPostsByAuthor(author: String!, limit: Int, nextToken: String): PaginatedPosts! allPost(limit: Int, nextToken: String): PaginatedPosts! getPost(id: ID): Post }
-
Nel riquadro Schema, modifica il
Mutation
tipo per aggiungere nuoveaddTag
eremoveTag
mutazioni come segue:type Mutation { addTag(id: ID!, tag: String!): Post removeTag(id: ID!, tag: String!): Post deletePost(id: ID!, expectedVersion: Int): Post upvotePost(id: ID!): Post downvotePost(id: ID!): Post updatePost( id: ID!, author: String, title: String, content: String, url: String, expectedVersion: Int! ): Post addPost( author: String!, title: String!, content: String!, url: String! ): Post! }
-
Scegli Save Scheme (Salva schema).
-
Nel riquadro Resolver a destra, individuate il
allPostsByTag
campo appena creato relativo alQuery
tipo, quindi scegliete Allega. Crea il tuo resolver usando lo snippet qui sotto:import * as ddb from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { limit = 20, nextToken, tag } = ctx.arguments; return ddb.scan({ limit, nextToken, filter: { tags: { contains: tag } } }); } export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
-
Salva tutte le modifiche che hai apportato al tuo resolver.
-
Ora, fai lo stesso per il
Mutation
campoaddTag
usando lo snippet qui sotto:Nota
Sebbene le utilità DynamoDB attualmente non supportino le operazioni sui set, puoi comunque interagire con i set creando tu stesso la richiesta.
import { util } from '@aws-appsync/utils' export function request(ctx) { const { id, tag } = ctx.arguments const expressionValues = util.dynamodb.toMapValues({ ':plusOne': 1 }) expressionValues[':tags'] = util.dynamodb.toStringSet([tag]) return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: `ADD tags :tags, version :plusOne`, expressionValues, }, } } export const response = (ctx) => ctx.result
-
Salva tutte le modifiche apportate al tuo resolver.
-
Ripeti l'operazione ancora una volta per il
Mutation
camporemoveTag
utilizzando lo snippet seguente:import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id, tag } = ctx.arguments; const expressionValues = util.dynamodb.toMapValues({ ':plusOne': 1 }); expressionValues[':tags'] = util.dynamodb.toStringSet([tag]); return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: `DELETE tags :tags ADD version :plusOne`, expressionValues, }, }; } export const response = (ctx) => ctx.resultexport
-
Salva tutte le modifiche apportate al tuo resolver.
Chiamali API per lavorare con i tag
Ora che hai configurato i resolver, AWS AppSync sa come tradurre le richieste in entrata addTag
e le richieste allPostsByTag
in DynamoDB e nelle operazioni. removeTag
UpdateItem
Scan
Per provare, selezioniamo uno dei post creati prima. Ad esempio, è possibile utilizzare un post redatto dall'utente Nadia
.
Per usare i tag
-
Nella tuaAPI, scegli la scheda Interrogazioni.
-
Nel riquadro Interrogazioni, aggiungi la seguente query:
query allPostsByAuthor { allPostsByAuthor( author: "Nadia" ) { posts { id title } nextToken } }
-
Scegli Esegui (il pulsante di riproduzione arancione), quindi scegli
allPostsByAuthor
. -
Tutti i post di Nadia dovrebbero apparire nel riquadro Risultati a destra del riquadro Query. La schermata visualizzata dovrebbe risultare simile a quella nell'immagine seguente:
{ "data": { "allPostsByAuthor": { "posts": [ { "id": "10", "title": "The cutest dog in the world" }, { "id": "11", "title": "Did you known...?" } ], "nextToken": null } } }
-
Usiamo quello con il titolo Il cane più carino del mondo. Registralo
id
perché lo userai più tardi. Ora proviamo ad aggiungere undog
tag. -
Nel riquadro Query, aggiungi la seguente mutazione. Dovremo anche aggiornare l'argomento
id
sul valore che abbiamo annotato in precedenza.mutation addTag { addTag(id:10 tag: "dog") { id title tags } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli.
addTag
Il post viene aggiornato con il nuovo tag:{ "data": { "addTag": { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog" ] } } }
-
Puoi aggiungere altri tag. Aggiorna la mutazione per cambiare l'
tag
argomento inpuppy
:mutation addTag { addTag(id:10 tag: "puppy") { id title tags } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
addTag
. Il post viene aggiornato con il nuovo tag:{ "data": { "addTag": { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog", "puppy" ] } } }
-
Puoi anche eliminare i tag. Nel riquadro Query, aggiungi la seguente mutazione. Dovrai anche aggiornare l'
id
argomento al valore annotato in precedenza:mutation removeTag { removeTag(id:10 tag: "puppy") { id title tags } }
-
Scegli Esegui (il pulsante arancione di riproduzione), quindi scegli
removeTag
. Il post viene aggiornato e il tagpuppy
viene eliminato.{ "data": { "addTag": { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog" ] } } }
-
Puoi anche cercare tutti i post che hanno un tag. Nel riquadro Interrogazioni, aggiungi la seguente query:
query allPostsByTag { allPostsByTag(tag: "dog") { posts { id title tags } nextToken } }
-
Scegli Esegui (il pulsante di riproduzione arancione), quindi scegli
allPostsByTag
. Vengono restituiti tutti i post con il tagdog
come segue:{ "data": { "allPostsByTag": { "posts": [ { "id": "10", "title": "The cutest dog in the world", "tags": [ "dog", "puppy" ] } ], "nextToken": null } } }
Conclusioni
In questo tutorial, hai creato un programma API che ti consente di manipolare Post
oggetti in DynamoDB AWS AppSync utilizzando GraphQL.
Per eseguire la pulizia, puoi eliminare AWS AppSync GraphQL API dalla console.
Per eliminare il ruolo associato alla tabella DynamoDB, seleziona l'origine dati nella tabella Fonti dati e fai clic su modifica. Annota il valore del ruolo in Crea o usa un ruolo esistente. Vai alla IAM console per eliminare il ruolo.
Per eliminare la tabella DynamoDB, fai clic sul nome della tabella nell'elenco delle fonti di dati. Si accede alla console DynamoDB dove è possibile eliminare la tabella.