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 interrogazioni di base () JavaScript
I resolver GraphQL connettono i campi nello schema di un tipo a un'origine dati. I resolver sono il meccanismo mediante il quale le richieste vengono soddisfatte.
Risolutori in AWS AppSync uso 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)
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 dei tutorial sopra menzionati.
In questa sezione, spiegheremo come creare e configurare i resolver per interrogazioni 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.
- Console
-
-
Accedi Console di gestione AWS e apri la AppSync console.
-
Nella dashboard delle API, scegli la tua API GraphQL.
-
Nella barra laterale, scegli Schema.
-
-
Inserisci i dettagli dello schema e dell'origine dati. Per ulteriori informazioni, consulta le sezioni https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html 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 interrogazione. Nella sezione Tipo di interrogazione, scegli Allega accanto al campo della tua richiesta.
-
Nella pagina Attach resolver, in Tipo di resolver, puoi scegliere tra risolutori a pipeline o unitari. Per ulteriori informazioni su questi tipi, consulta Resolvers. https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html Questa guida utilizzerà.
pipeline resolversSuggerimento
Quando si creano risolutori di pipeline, le fonti di dati verranno collegate alle funzioni della pipeline. Le funzioni vengono create dopo aver creato il pipeline resolver stesso, motivo per cui non è possibile impostarle in questa pagina. Se utilizzi un risolutore di unità, l'origine dati è collegata direttamente al resolver, quindi dovresti impostarla in questa pagina.
Per Resolver runtime, scegli di abilitare il runtime.
APPSYNC_JSJavaScript -
Puoi abilitare la memorizzazione nella cache per questa API. Ti consigliamo di disattivare questa funzionalità per ora. Scegli Crea.
-
Nella pagina Edit 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
Nel nostro esempio, lasceremo semplicemente la richiesta vuota e la risposta impostata per restituire l'ultimo risultato dell'origine dati dal contesto: https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html
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 verranno eseguite in tale 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 vedere invece un 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 allegando un resolver per
getPost, che recupera un oggetto entro.PostidSupponiamo di aver già impostato una tabella DynamoDB per questo schema. La sua chiave di partizione è impostata suided è vuota. -
Inserisci un
Function name. -
In Function code, dovrai implementare il comportamento della funzione. Questo potrebbe creare confusione, ma ogni funzione avrà il proprio gestore locale di richieste e risposte. La richiesta viene eseguita, quindi viene effettuata l'invocazione dell'origine dati per gestire la richiesta, quindi la risposta dell'origine dati viene elaborata dal gestore della risposta. Il risultato viene memorizzato nell'oggetto di contesto. https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html Successivamente, la funzione successiva nell'elenco verrà eseguita o verrà passata al gestore della risposta after step, se è l'ultima.
Nota
Nel nostro esempio, stiamo allegando un resolver a
getPost, che ottiene un elenco diPostoggetti dall'origine 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 sua forza sta nella sua interconnessione con altri servizi. AWS Poiché utilizziamo DynamoDB, abbiamo 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 sull'origine dati. L'argomento contiene l'oggetto del contesto (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'Scanoperazione (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 memorizzato nell'oggetto di contesto comeresultcontenitore prima di essere passato al gestore della risposta.requestViene eseguito prima della risposta nella pipeline. -
response: Il gestore della risposta che restituisce l'output di.requestL'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.ctxsi riferisce all'oggetto di contesto.prevsi riferisce alla precedente operazione in pipeline, che era la nostrarequest.resultContiene i risultati del resolver mentre si muove nella pipeline. Se metti tutto insieme, restituiscectx.prev.resultil 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.
-
- CLI
-
Per aggiungere la tua funzione
-
Crea una funzione per il tuo pipeline resolver usando il comando.
create-functionDovrai inserire alcuni parametri per questo particolare comando:
-
La
api-idtua API. -
nameLa funzione nella AWS AppSync console. -
Il
data-source-name, o il nome dell'origine dati che verrà utilizzata dalla funzione. Deve essere già creato e collegato all'API GraphQL nel AWS AppSync servizio. -
L'ambiente
runtime, o, e il linguaggio della funzione. Per JavaScript, il nome deve essereAPPSYNC_JS, e il runtime,1.0.0. -
I gestori di richieste e risposte
code, o della tua funzione. Sebbene sia possibile digitarlo manualmente, è molto più semplice aggiungerlo a un file .txt (o in un formato simile) e quindi passarlo come argomento.Nota
Il nostro codice di interrogazione sarà contenuto in un file passato come argomento:
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; }
Un comando di esempio può essere simile a questo:
aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name get_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file://~/path/to/file/{filename}.{fileType}Verrà restituito un output nella CLI. Ecco un esempio:
{ "functionConfiguration": { "functionId": "ejglgvmcabdn7lx75ref4qeig4", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/ejglgvmcabdn7lx75ref4qeig4", "name": "get_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output goes here" } }Nota
Assicurati di registrarlo
functionIdda qualche parte in quanto verrà utilizzato per collegare la funzione al resolver. -
Per creare il tuo resolver
-
Crea una funzione di pipeline per
Queryeseguendo il comando.create-resolverDovrai inserire alcuni parametri per questo particolare comando:
-
La
api-idtua API. -
Il
type-name, o il tipo di oggetto speciale nello schema (Query, Mutation, Subscription). -
Il
field-name, o l'operazione sul campo all'interno del tipo di oggetto speciale a cui si desidera collegare il resolver. -
The
kind, che specifica un'unità o un risolutore di pipeline. Impostatelo per abilitare le funzioni dellaPIPELINEpipeline. -
La o
pipeline-configle funzioni da collegare al resolver. Assicurati di conoscerefunctionIdi valori delle tue funzioni. L'ordine di inserimento nell'elenco è importante. -
Il
runtime, che eraAPPSYNC_JS(JavaScript).runtimeVersionAttualmente è1.0.0. -
Il
code, che contiene i gestori delle fasi precedenti e successive.Nota
Il nostro codice di query si troverà in un file passato come argomento:
import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
Un comando di esempio può essere simile a questo:
aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Query \ --field-name getPost \ --kind PIPELINE \ --pipeline-config functions=ejglgvmcabdn7lx75ref4qeig4 \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}Verrà restituito un output nella CLI. Ecco un esempio:
{ "resolver": { "typeName": "Mutation", "fieldName": "getPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/getPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "ejglgvmcabdn7lx75ref4qeig4" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output goes here" } } -
-
- CDK
-
Suggerimento
Prima di utilizzare il CDK, ti consigliamo di consultare la documentazione ufficiale del CDK insieme AWS AppSync ai riferimenti al CDK. https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html
I passaggi elencati di seguito mostreranno solo un esempio generale dello snippet utilizzato per aggiungere una particolare risorsa. Questa non è pensata per essere una soluzione funzionante nel codice di produzione. Supponiamo inoltre che tu abbia già un'app funzionante.
Un'app di base avrà bisogno delle seguenti cose:
-
Direttive per l'importazione dei servizi
-
Codice dello schema
-
Generatore di sorgenti di dati
-
Codice funzione
-
Codice resolver
Dalle sezioni Designing your schema e Attaching a data source, sappiamo che il file stack includerà le direttive di importazione del modulo:
import * asxfrom 'x'; # import wildcard as the 'x' keyword from 'x-service' import {a,b, ...} from 'c'; # import {specific constructs} from 'c-service'Nota
Nelle sezioni precedenti, abbiamo solo indicato come AWS AppSync importare i costrutti. In codice reale, dovrai importare più servizi solo per eseguire l'app. Nel nostro esempio, se dovessimo creare un'app CDK molto semplice, importeremmo almeno il AWS AppSync servizio insieme alla nostra fonte di dati, che era una tabella DynamoDB. Avremmo anche bisogno di importare alcuni costrutti aggiuntivi per distribuire l'app:
import * as cdk from 'aws-cdk-lib'; import * as appsync from 'aws-cdk-lib/aws-appsync'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import { Construct } from 'constructs';Per riassumere ognuno di questi:
-
import * as cdk from 'aws-cdk-lib';: consente di definire l'app CDK e i relativi costrutti, ad esempio lo stack. Contiene anche alcune utili funzioni di utilità per la nostra applicazione, come la manipolazione dei metadati. Se conoscete questa direttiva di importazione, ma vi state chiedendo perché la libreria principale cdk non viene utilizzata qui, consultate la pagina sulla migrazione. https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html -
import * as appsync from 'aws-cdk-lib/aws-appsync';: Importa il AWS AppSync servizio. -
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';: Importa il servizio DynamoDB. -
import { Construct } from 'constructs';: Ne abbiamo bisogno per definire il costrutto radice.
Il tipo di importazione dipende dai servizi che stai chiamando. Ti consigliamo di consultare la documentazione del CDK per alcuni esempi. Lo schema nella parte superiore della pagina sarà un file separato nella tua app CDK come
.graphqlfile. Nel file stack, possiamo associarlo a un nuovo GraphQL usando il modulo:const add_api = new appsync.GraphqlApi(this, 'graphQL-example', { name: 'my-first-api', schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema.graphql')), });Nota
Nell'ambito
add_api, stiamo aggiungendo una nuova API GraphQL utilizzando lanewparola chiave seguita da.appsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)Il nostro scopo èthisl'id CFN egraphQL-examplele nostre props sonomy-first-api(nome dell'API nella console) eschema.graphql(il percorso assoluto del file di schema).Per aggiungere una fonte di dati, devi prima aggiungere la tua fonte di dati allo stack. Quindi, è necessario associarlo all'API GraphQL utilizzando il metodo specifico della fonte. L'associazione avverrà quando creerai la tua funzione di resolver. Nel frattempo, facciamo un esempio creando la tabella DynamoDB usando:
dynamodb.Tableconst add_ddb_table = new dynamodb.Table(this, 'posts-table', { partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING, }, });Nota
Se dovessimo usarlo nel nostro esempio, aggiungeremmo una nuova tabella DynamoDB con l'id CFN di e una chiave di partizione di.
posts-tableid (S)Successivamente, dobbiamo implementare il nostro resolver nel file stack. Ecco un esempio di una semplice query che analizza tutti gli elementi in una tabella DynamoDB:
const add_func = new appsync.AppsyncFunction(this, 'func-get-posts', { name: 'get_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'Scan' }; } export function response(ctx) { return ctx.result.items; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-get-posts', { add_api, typeName: 'Query', fieldName: 'getPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func], });Nota
Innanzitutto, abbiamo creato una funzione chiamata.
add_funcQuesto ordine di creazione può sembrare un po' controintuitivo, ma dovete creare le funzioni nel vostro pipeline resolver prima di creare il resolver stesso. Una funzione segue la seguente forma:AppsyncFunction(scope: Construct, id: string, props: AppsyncFunctionProps)Il nostro scopo era
this, il nostro ID CFN erafunc-get-postse i nostri oggetti di scena contenevano i dettagli effettivi della funzione. All'interno degli oggetti di scena, abbiamo incluso:-
La
namefunzione che sarà presente nella AWS AppSync console (get_posts_func_1). -
L'API GraphQL che abbiamo creato in precedenza (
add_api). -
L'origine dati; questo è il punto in cui colleghiamo l'origine dati al valore dell'API GraphQL, quindi la alleghiamo alla funzione. Prendiamo la tabella che abbiamo creato (
add_ddb_table) e la alleghiamo all'API GraphQL (add_api) utilizzando uno deiGraphqlApimetodi (addDynamoDbDataSource). Il valore id (table-for-posts) è il nome dell'origine dati nella AWS AppSync console. Per un elenco di metodi specifici della fonte, consulta le seguenti pagine: -
Il codice contiene i gestori di richiesta e risposta della nostra funzione, ovvero una semplice scansione e restituzione.
-
Il runtime specifica che vogliamo utilizzare la versione runtime APPSYNC_JS 1.0.0. Nota che questa è attualmente l'unica versione disponibile per APPSYNC_JS.
Successivamente, dobbiamo collegare la funzione al risolutore di pipeline. Abbiamo creato il nostro resolver utilizzando il modulo:
Resolver(scope: Construct, id: string, props: ResolverProps)Il nostro scopo era
this, il nostro ID CFN erapipeline-resolver-get-postse i nostri oggetti di scena contenevano i dettagli effettivi della funzione. All'interno degli oggetti di scena, abbiamo incluso:-
L'API GraphQL che abbiamo creato in precedenza ()
add_api. -
Il nome speciale del tipo di oggetto; si tratta di un'operazione di interrogazione, quindi abbiamo semplicemente aggiunto il valore
Query. -
Il nome del campo (
getPost) è il nome del campo nello schema sotto ilQuerytipo. -
Il codice contiene i gestori prima e dopo. Il nostro esempio restituisce semplicemente i risultati presenti nel contesto dopo che la funzione ha eseguito l'operazione.
-
Il runtime specifica che vogliamo usare la versione runtime APPSYNC_JS 1.0.0. Nota che questa è attualmente l'unica versione disponibile per APPSYNC_JS.
-
La configurazione della pipeline contiene il riferimento alla funzione che abbiamo creato ().
add_func
-
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 l'origine dati. Il gestore della richiesta ha inviato un'Scanoperazione a AWS AppSync, indicando quale operazione eseguire sull'origine dati DynamoDB. Il gestore delle risposte 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.
- Console
-
-
Accedi Console di gestione AWS e apri la console. AppSync
-
Nella dashboard delle API, 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 allegando un resolver per
createPost, che aggiunge un oggetto alla nostra tabella.PostSupponiamo di utilizzare la stessa tabella DynamoDB dell'ultima sezione. La sua chiave di partizione è impostata suided è vuota. -
Nella pagina Attach resolver, in Tipo di resolver, scegli.
pipeline resolversCome promemoria, puoi trovare ulteriori informazioni sui resolver qui. https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html Per Resolver runtime, scegli di abilitare il runtime.APPSYNC_JSJavaScript -
Puoi abilitare la memorizzazione nella cache per questa API. Ti consigliamo di disattivare questa funzionalità per ora. Scegli Crea.
-
Scegli Aggiungi funzione, quindi scegli Crea nuova funzione. In alternativa, potresti vedere invece 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 Function code, dovrai implementare il comportamento della funzione. Si tratta di una mutazione, quindi la richiesta eseguirà idealmente un'operazione di modifica dello stato sull'origine dati richiamata. Il risultato verrà elaborato dalla funzione di risposta.
Nota
createPoststa aggiungendo, o «inserendo», un nuovoPostelemento 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
requesteresponsefunzioni:-
request: il gestore della richiesta accetta il contesto come argomento. L'istruzione return del gestore delle richieste esegue unPutItemcomando, che è un'operazione DynamoDB integrata (vedi qui o qui per alcuni esempi). IlPutItemcomando aggiunge unPostoggetto alla nostra tabella DynamoDB prendendo ilkeyvalore della partizione (generato automaticamente dautil.autoid()) eattributesdall'input dell'argomento di contesto (questi sono i valori che passeremo nella nostra richiesta). Gli argomenti delkeycampo isideattributessono gli argomenti del campodateandtitle. Sono entrambi preformattati tramite l'util.dynamodb.toMapValueshelper 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.
-
- CLI
-
Per aggiungere la tua funzione
-
Crea una funzione per il tuo pipeline resolver usando il comando.
create-functionDovrai inserire alcuni parametri per questo particolare comando:
-
La
api-idtua API. -
nameLa funzione nella AWS AppSync console. -
Il
data-source-name, o il nome dell'origine dati che verrà utilizzata dalla funzione. Deve essere già creato e collegato all'API GraphQL nel AWS AppSync servizio. -
L'ambiente
runtime, o, e il linguaggio della funzione. Per JavaScript, il nome deve essereAPPSYNC_JS, e il runtime,1.0.0. -
I gestori di richieste e risposte
code, o della tua funzione. Sebbene sia possibile digitarlo manualmente, è molto più semplice aggiungerlo a un file .txt (o in un formato simile) e passarlo come argomento.Nota
Il nostro codice di interrogazione sarà contenuto in un file passato come argomento:
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; }
Un comando di esempio può essere simile a questo:
aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name add_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}Verrà restituito un output nella CLI. Ecco un esempio:
{ "functionConfiguration": { "functionId": "vulcmbfcxffiram63psb4dduoa", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/vulcmbfcxffiram63psb4dduoa", "name": "add_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output foes here" } }Nota
Assicurati di registrarlo
functionIdda qualche parte in quanto verrà utilizzato per collegare la funzione al resolver. -
Per creare il tuo resolver
-
Crea una funzione di pipeline per
Mutationeseguendo il comando.create-resolverDovrai inserire alcuni parametri per questo particolare comando:
-
La
api-idtua API. -
Il
type-name, o il tipo di oggetto speciale nello schema (Query, Mutation, Subscription). -
Il
field-name, o l'operazione sul campo all'interno del tipo di oggetto speciale a cui si desidera collegare il resolver. -
The
kind, che specifica un'unità o un risolutore di pipeline. Impostatelo per abilitare le funzioni dellaPIPELINEpipeline. -
La o
pipeline-configle funzioni da collegare al resolver. Assicurati di conoscerefunctionIdi valori delle tue funzioni. L'ordine di inserimento nell'elenco è importante. -
Il
runtime, che eraAPPSYNC_JS(JavaScript).runtimeVersionAttualmente è1.0.0. -
Il
code, che contiene i passaggi prima e dopo.Nota
Il nostro codice di query si troverà in un file passato come argomento:
import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
Un comando di esempio può essere simile a questo:
aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Mutation \ --field-name createPost \ --kind PIPELINE \ --pipeline-config functions=vulcmbfcxffiram63psb4dduoa \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}Verrà restituito un output nella CLI. Ecco un esempio:
{ "resolver": { "typeName": "Mutation", "fieldName": "createPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/createPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "vulcmbfcxffiram63psb4dduoa" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output goes here" } } -
-
- CDK
-
Suggerimento
Prima di utilizzare il CDK, ti consigliamo di consultare la documentazione ufficiale del CDK insieme AWS AppSync ai riferimenti al CDK. https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html
I passaggi elencati di seguito mostreranno solo un esempio generale dello snippet utilizzato per aggiungere una particolare risorsa. Questa non è pensata per essere una soluzione funzionante nel codice di produzione. Supponiamo inoltre che tu abbia già un'app funzionante.
-
Per creare una mutazione, supponendo che siate nello stesso progetto, potete aggiungerla al file dello stack come nella query. Ecco una funzione e un risolutore modificati per una mutazione che ne aggiunge una nuova alla tabella:
Postconst add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', { name: 'add_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } export function response(ctx) { return ctx.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-create-posts', { add_api, typeName: 'Mutation', fieldName: 'createPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func_2], });Nota
Poiché questa mutazione e la query sono strutturate in modo simile, ci limiteremo a spiegare le modifiche apportate per apportare la mutazione.
Nella funzione, abbiamo modificato l'id CFN
func-add-poste il nome inadd_posts_func_1per riflettere il fatto che stiamo aggiungendo qualcosaPostsalla tabella. Nell'origine dati, abbiamo creato una nuova associazione alla nostra tabella (add_ddb_table) nella AWS AppSync consoletable-for-posts-2perché iladdDynamoDbDataSourcemetodo lo richiede. Tieni presente che questa nuova associazione utilizza ancora la stessa tabella creata in precedenza, ma ora abbiamo due connessioni ad essa nella AWS AppSync console: una per la query astable-for-postse una per la mutazione astable-for-posts-2. Il codice è stato modificato per aggiungere un valorePostgenerando automaticamente il suoidvalore e accettando l'input di un cliente per il resto dei campi.Nel resolver, abbiamo modificato il valore id in modo
pipeline-resolver-create-postsche rifletta il fatto che stiamo aggiungendoPostsalla tabella. Per riflettere la mutazione nello schema, il nome del tipo è stato modificato inMutation, e il nome,.createPostLa configurazione della pipeline è stata impostata sulla nostra nuova funzione di mutazione.add_func_2
-
Per riassumere ciò che accade in questo esempio, converte AWS AppSync automaticamente gli argomenti definiti nel createPost campo dallo schema GraphQL in operazioni DynamoDB. L'esempio memorizza i record in DynamoDB utilizzando una chiave diid, che viene creata automaticamente utilizzando il nostro helper. util.autoId() Tutti gli altri campi che passi al contesto arguments (ctx.args.input) dalle richieste effettuate nella AWS AppSync console o in altro modo verranno archiviati come attributi della tabella. Sia la chiave che gli attributi vengono mappati automaticamente in un formato DynamoDB compatibile utilizzando l'helper. util.dynamodb.toMapValues(values)
AWS AppSync supporta anche i flussi di lavoro di test e debug per la modifica dei resolver. Puoi usare un context oggetto fittizio per vedere il valore trasformato del modello prima di richiamarlo. Facoltativamente, è possibile visualizzare l'intera richiesta a un'origine dati in modo interattivo quando si esegue una query. Per ulteriori informazioni, consulta Test and debug resolvers () JavaScript e Monitoring and logging. https://docs.aws.amazon.com/appsync/latest/devguide/monitoring.html#aws-appsync-monitoring
Resolver avanzati
Se stai seguendo la sezione opzionale sull'impaginazione in Progettazione dello schema, devi comunque aggiungere il resolver alla tua richiesta per utilizzare l'impaginazione. Il nostro esempio ha utilizzato una paginazione della query chiamata getPosts per restituire solo una parte delle cose richieste alla volta. Il codice del nostro resolver su quel campo potrebbe assomigliare a questo:
/** * 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, inseriamo il contesto della richiesta. Il nostro limit è20, il che significa che restituiamo fino a 20 Posts nella prima query. Il nostro nextToken cursore è fisso sulla prima Post voce nell'origine dati. Questi vengono passati agli args. La richiesta esegue quindi una scansione dal primo Post al numero limite di scansione. L'origine dati memorizza il risultato nel contesto, che viene passato alla risposta. La risposta Posts restituisce il valore recuperato, quindi imposta nextToken il valore 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.