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à.
I resolver GraphQL connettono i campi nello schema di un tipo a un'origine dati. I resolver sono il meccanismo mediante il quale vengono soddisfatte le richieste.
Resolver AWS AppSync utilizzati JavaScript per convertire un'espressione GraphQL in un formato utilizzabile dall'origine dati. In alternativa, i modelli di mappatura possono essere scritti in Apache Velocity Template Language (VTL) per
Questa sezione descrive come configurare i resolver utilizzando. JavaScript La sezione Resolver tutorials (JavaScript) fornisce tutorial approfonditi su come implementare i resolver utilizzando. JavaScript La sezione Resolver reference (JavaScript) fornisce una spiegazione delle operazioni di utilità che possono essere utilizzate con i resolver. JavaScript
Consigliamo di seguire questa guida prima di tentare di utilizzare uno qualsiasi dei tutorial sopra citati.
In questa sezione, spiegheremo come creare e configurare resolver per query e mutazioni.
Nota
Questa guida presuppone che tu abbia creato il tuo schema e che tu abbia almeno una query o una mutazione. Se stai cercando abbonamenti (dati in tempo reale), consulta questa guida.
In questa sezione, forniremo alcuni passaggi generali per la configurazione dei resolver insieme a un esempio che utilizza lo schema seguente:
// schema.graphql file
input CreatePostInput {
title: String
date: AWSDateTime
}
type Post {
id: ID!
title: String
date: AWSDateTime
}
type Mutation {
createPost(input: CreatePostInput!): Post
}
type Query {
getPost: [Post]
}
Creazione di risolutori di query di base
Questa sezione ti mostrerà come creare un risolutore di query di base.
-
Accedi a AWS Management Console e apri la AppSync console.
-
Nella APIs dashboard, scegli la tua API GraphQL.
-
Nella barra laterale, scegli Schema.
-
-
Inserisci i dettagli dello schema e della fonte di dati. Per ulteriori informazioni, consulta le sezioni Progettazione dello schema e Collegamento di un'origine dati.
-
Accanto all'editor dello schema, c'è una finestra chiamata Resolvers. Questa casella contiene un elenco dei tipi e dei campi definiti nella finestra Schema. È possibile allegare resolver ai campi. Molto probabilmente allegherai dei resolver alle tue operazioni sul campo. In questa sezione, esamineremo semplici configurazioni di query. Nella sezione Tipo di query, scegli Allega accanto al campo della query.
-
Nella pagina Attach resolver, in Tipo di resolver, puoi scegliere tra resolver pipeline o unit. Per ulteriori informazioni su questi tipi, consulta Resolvers. Questa guida utilizzerà.
pipeline resolvers
Suggerimento
Durante la creazione di risolutori di pipeline, le sorgenti dati verranno allegate alle funzioni della pipeline. Le funzioni vengono create dopo aver creato il risolutore della pipeline stesso, motivo per cui non è possibile impostarlo in questa pagina. Se utilizzi un risolutore di unità, la fonte di dati è collegata direttamente al resolver, quindi devi impostarla in questa pagina.
Per Resolver runtime, scegli di abilitare il runtime.
APPSYNC_JS
JavaScript -
Puoi abilitare la memorizzazione nella cache per questa API. Ti consigliamo di disattivare questa funzionalità per ora. Scegli Create (Crea) .
-
Nella pagina Modifica resolver, c'è un editor di codice chiamato Resolver code che consente di implementare la logica per il gestore e la risposta del resolver (prima e dopo i passaggi). Per ulteriori informazioni, consulta la panoramica dei resolver. JavaScript
Nota
import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }
Sotto questa sezione, c'è una tabella chiamata Funzioni. Le funzioni consentono di implementare codice che può essere riutilizzato su più resolver. Invece di riscrivere o copiare costantemente il codice, puoi memorizzare il codice sorgente come funzione da aggiungere a un resolver ogni volta che ne hai bisogno.
Le funzioni costituiscono la maggior parte dell'elenco delle operazioni di una pipeline. Quando si utilizzano più funzioni in un resolver, si imposta l'ordine delle funzioni e queste verranno eseguite in quell'ordine in sequenza. Vengono eseguiti dopo l'esecuzione della funzione di richiesta e prima dell'inizio della funzione di risposta.
Per aggiungere una nuova funzione, in Funzioni, scegli Aggiungi funzione, quindi Crea nuova funzione. In alternativa, potresti invece visualizzare il pulsante Crea funzione tra cui scegliere.
-
Scegli una fonte di dati. Questa sarà la fonte di dati su cui agisce il resolver.
Nota
Nel nostro esempio, stiamo collegando un resolver per
getPost
, che recupera un oggetto tramite.Post
id
Supponiamo di aver già impostato una tabella DynamoDB per questo schema. La sua chiave di partizione è impostata suid
ed è vuota. -
Inserisci un
Function name
. -
In Codice funzione, dovrai implementare il comportamento della funzione. Ciò potrebbe creare confusione, ma ogni funzione avrà il proprio gestore locale di richieste e risposte. La richiesta viene eseguita, quindi viene effettuata la chiamata all'origine dati per gestire la richiesta, quindi la risposta dell'origine dati viene elaborata dal gestore della risposta. Il risultato viene archiviato nell'oggetto contestuale. Successivamente, verrà eseguita la funzione successiva nell'elenco o verrà passata al gestore di risposte post-passaggio se è l'ultima.
Nota
Nel nostro esempio, stiamo collegando un resolver a
getPost
, che ottiene un elenco diPost
oggetti dalla fonte di dati. La nostra funzione di richiesta richiederà i dati dalla nostra tabella, la tabella passerà la sua risposta al contesto (ctx), quindi la risposta restituirà il risultato nel contesto. AWS AppSync la forza di questa soluzione risiede nella sua interconnessione con altri servizi. AWS Poiché utilizziamo DynamoDB, disponiamo di una suite di operazioni per semplificare cose come queste. Abbiamo anche alcuni esempi standard per altri tipi di fonti di dati.Il nostro codice sarà simile a questo:
import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned post items */ export function response(ctx) { return ctx.result.items; }
In questo passaggio, abbiamo aggiunto due funzioni:
-
request
: Il gestore della richiesta esegue l'operazione di recupero sulla fonte di dati. L'argomento contiene l'oggetto context (ctx
) o alcuni dati disponibili per tutti i resolver che eseguono una particolare operazione. Ad esempio, potrebbe contenere dati di autorizzazione, i nomi dei campi da risolvere, ecc. L'istruzione return esegue un'Scan
operazione (vedi qui per alcuni esempi). Poiché lavoriamo con DynamoDB, siamo autorizzati a utilizzare alcune delle operazioni di quel servizio. La scansione esegue un recupero di base di tutti gli elementi della nostra tabella. Il risultato di questa operazione viene archiviato nell'oggetto di contesto comeresult
contenitore prima di essere passato al gestore delle risposte.request
Viene eseguito prima della risposta nella pipeline. -
response
: Il gestore di risposte che restituisce l'output di.request
L'argomento è l'oggetto di contesto aggiornato e l'istruzione return èctx.prev.result
. A questo punto della guida, potresti non avere familiarità con questo valore.ctx
si riferisce all'oggetto contestuale.prev
si riferisce all'operazione precedente nella pipeline, che era la nostrarequest
.result
Contiene il/i risultato/i del resolver mentre si muove attraverso la pipeline. Se metti tutto insieme,ctx.prev.result
restituisce il risultato dell'ultima operazione eseguita, che era il gestore della richiesta.
-
-
Scegli Crea dopo aver finito.
-
-
Tornando alla schermata del resolver, in Funzioni, scegli il menu a discesa Aggiungi funzione e aggiungi la tua funzione all'elenco delle funzioni.
-
Scegli Salva per aggiornare il resolver.
Per riassumere ciò che è successo in questo esempio, hai visto una AWS AppSync funzione che implementava un gestore di richieste e risposte. La funzione era responsabile dell'interazione con la fonte dei dati. Il gestore della richiesta ha inviato un'Scan
operazione a AWS AppSync, indicandogli quale operazione eseguire sull'origine dati DynamoDB. Il gestore della risposta ha restituito l'elenco degli elementi (). ctx.result.items
L'elenco degli elementi è stato quindi mappato automaticamente al tipo Post
GraphQL.
Creazione di risolutori di mutazioni di base
Questa sezione ti mostrerà come creare un risolutore di mutazioni di base.
-
Accedi a AWS Management Console e apri la console. AppSync
-
Nella APIs dashboard, scegli la tua API GraphQL.
-
Nella barra laterale, scegli Schema.
-
-
Nella sezione Resolver e nel tipo di mutazione, scegli Allega accanto al tuo campo.
Nota
Nel nostro esempio, stiamo collegando un resolver per
createPost
, che aggiunge un oggetto alla nostra tabella.Post
Supponiamo di utilizzare la stessa tabella DynamoDB dell'ultima sezione. La sua chiave di partizione è impostata suid
ed è vuota. -
Nella pagina Allega resolver, in Tipo di risolutore, scegli.
pipeline resolvers
Come promemoria, puoi trovare ulteriori informazioni sui resolver qui. Per Resolver runtime, scegli di abilitare il runtime.APPSYNC_JS
JavaScript -
Puoi abilitare la memorizzazione nella cache per questa API. Ti consigliamo di disattivare questa funzionalità per ora. Scegli Create (Crea) .
-
Scegli Aggiungi funzione, quindi scegli Crea nuova funzione. In alternativa, potresti invece visualizzare un pulsante Crea funzione tra cui scegliere.
-
Scegli l'origine dati. Questa dovrebbe essere la fonte di cui manipolerai i dati con la mutazione.
-
Inserisci un.
Function name
-
In Codice funzione, dovrai implementare il comportamento della funzione. Questa è una mutazione, quindi la richiesta eseguirà idealmente alcune operazioni di modifica dello stato sulla fonte di dati richiamata. Il risultato verrà elaborato dalla funzione di risposta.
Nota
createPost
sta aggiungendo, o «inserendo», un nuovoPost
nella tabella con i nostri parametri come dati. Potremmo aggiungere qualcosa del genere:import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
In questo passaggio, abbiamo anche aggiunto
request
response
funzioni:-
request
: Il gestore della richiesta accetta il contesto come argomento. L'istruzione return del gestore di richieste esegue unPutItem
comando, che è un'operazione DynamoDB integrata (vedi qui o qui per alcuni esempi). IlPutItem
comando aggiunge unPost
oggetto alla nostra tabella DynamoDB prendendo il valore dellakey
partizione (generato automaticamenteutil.autoid()
da)attributes
e dall'input dell'argomento di contesto (questi sono i valori che passeremo nella nostra richiesta). Gli argomentikey
èid
eattributes
sono glidate
etitle
i campi. Sono entrambi preformattati tramite l'util.dynamodb.toMapValues
helper per funzionare con la tabella DynamoDB. -
response
: La risposta accetta il contesto aggiornato e restituisce il risultato del gestore della richiesta.
-
-
Scegli Crea dopo aver finito.
-
-
Tornando alla schermata del resolver, in Funzioni, scegli il menu a discesa Aggiungi funzione e aggiungi la tua funzione all'elenco delle funzioni.
-
Scegli Salva per aggiornare il resolver.
Per riassumere ciò che sta accadendo in questo esempio, converte AWS AppSync automaticamente gli argomenti definiti nel createPost
campo dallo schema GraphQL in operazioni DynamoDB. L'esempio archivia i record in DynamoDB utilizzando una chiave id
di, che viene creata automaticamente utilizzando il nostro helper. util.autoId()
Tutti gli altri campi passati agli argomenti di contesto (ctx.args.input
) dalle richieste effettuate nella AWS AppSync console o in altro modo verranno memorizzati come attributi della tabella. Sia la chiave che gli attributi vengono mappati automaticamente su un formato DynamoDB compatibile utilizzando l'helper. util.dynamodb.toMapValues(values)
AWS AppSync supporta anche flussi di lavoro di test e debug per la modifica dei resolver. È possibile utilizzare un context
oggetto fittizio per vedere il valore trasformato del modello prima di richiamarlo. Facoltativamente, puoi visualizzare la richiesta completa a un'origine dati in modo interattivo quando esegui una query. Per ulteriori informazioni, vedete Test and debug resolvers () JavaScript e Monitoring and logging.
Resolver avanzati
Se stai seguendo la sezione opzionale sull'impaginazione in Progettazione dello schema, devi comunque aggiungere il resolver alla richiesta per utilizzare l'impaginazione. Il nostro esempio ha utilizzato una paginazione di query chiamata getPosts
per restituire solo una parte degli elementi richiesti alla volta. Il codice del nostro resolver su quel campo potrebbe essere simile al seguente:
/**
* Performs a scan on the dynamodb data source
*/
export function request(ctx) {
const { limit = 20, nextToken } = ctx.args;
return { operation: 'Scan', limit, nextToken };
}
/**
* @returns the result of the `put` operation
*/
export function response(ctx) {
const { items: posts = [], nextToken } = ctx.result;
return { posts, nextToken };
}
Nella richiesta, passiamo nel contesto della richiesta. Il nostro limit
è20
, il che significa che restituiamo fino a 20 Posts
nella prima query. Il nostro nextToken
cursore è fissato alla prima Post
voce nella fonte di dati. Questi vengono passati agli args. La richiesta esegue quindi una scansione dalla prima Post
fino al numero limite di scansione. L'origine dati memorizza il risultato nel contesto, che viene passato alla risposta. La risposta Posts
restituisce la risposta recuperata, quindi imposta l'impostazione nextToken
è impostata sulla Post
voce subito dopo il limite. La richiesta successiva viene inviata per fare esattamente la stessa cosa, ma a partire dall'offset subito dopo la prima query. Tieni presente che questo tipo di richieste vengono eseguite in sequenza e non in parallelo.