Riferimento all'oggetto contestuale del Resolver - AWS AppSync

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à.

Riferimento all'oggetto contestuale del Resolver

AWS AppSyncdefinisce un insieme di variabili e funzioni per lavorare con i gestori di richieste e risposte. Ciò semplifica le operazioni logiche sui dati con GraphQL. Questo documento descrive tali funzioni e fornisce esempi.

Accesso a context

Lacontextl'argomento di un gestore di richieste e risposte è un oggetto che contiene tutte le informazioni contestuali per la chiamata del resolver. Ha la struttura seguente:

type Context = { arguments: any; args: any; identity: Identity; source: any; error?: { message: string; type: string; }; stash: any; result: any; prev: any; request: Request; info: Info; };
Nota

Scoprirai spesso checontextl'oggetto è indicato comectx.

Ogni campo delcontextl'oggetto è definito come segue:

context campi

arguments

Una mappa contenente tutti gli argomenti GraphQL per questo campo.

identity

Un oggetto contenente le informazioni sul chiamante. Vedi Identità per ulteriori informazioni sulla struttura di questo campo.

source

Una mappa contenente la risoluzione del campo padre.

stash

Lo stash è un oggetto reso disponibile all'interno di ogni resolver e gestore di funzioni. Lo stesso oggetto stash vive durante una singola esecuzione del resolver. Ciò significa che è possibile utilizzare lo stash per passare dati arbitrari tra gestori di richieste e risposte e tra funzioni in un resolver di pipeline.

Nota

Non è possibile eliminare o sostituire l'intera scorta, ma è possibile aggiungere, aggiornare, eliminare e leggere le proprietà della scorta.

Puoi aggiungere elementi alla scorta modificando uno degli esempi di codice seguenti:

//Example 1 ctx.stash.newItem = { key: "something" } //Example 2 Object.assign(ctx.stash, {key1: value1, key2: value})

Puoi rimuovere elementi dalla scorta modificando il codice seguente:

delete ctx.stash.key
result

Un container per i risultati di questo resolver. Questo campo è disponibile solo per i gestori di risposte.

Ad esempio, se stai risolvendo ilauthorcampo della seguente query:

query { getPost(id: 1234) { postId title content author { id name } } }

Quindi il completocontextla variabile è disponibile quando viene valutato un gestore di risposte:

{ "arguments" : { id: "1234" }, "source": {}, "result" : { "postId": "1234", "title": "Some title", "content": "Some content", "author": { "id": "5678", "name": "Author Name" } }, "identity" : { "sourceIp" : ["x.x.x.x"], "userArn" : "arn:aws:iam::123456789012:user/appsync", "accountId" : "666666666666", "user" : "AIDAAAAAAAAAAAAAAAAAA" } }
prev.result

Il risultato di qualsiasi operazione precedente sia stata eseguita in un resolver di pipeline.

Se l'operazione precedente era il gestore delle richieste del risolutore di pipeline, alloractx.prev.resultrappresenta il risultato della valutazione e viene reso disponibile alla prima funzione della pipeline.

Se l'operazione precedente era la prima funzione, alloractx.prev.resultrappresenta il risultato della valutazione del gestore della risposta della prima funzione e viene reso disponibile alla seconda funzione nella pipeline.

Se l'operazione precedente era l'ultima funzione, alloractx.prev.resultrappresenta il risultato della valutazione dell'ultima funzione e viene reso disponibile al gestore di risposte del risolutore di pipeline.

info

Un oggetto contenente le informazioni sulla richiesta GraphQL. Per la struttura di questo campo, consulta Info.

Identità

La sezione identity contiene le informazioni sul chiamante. La forma di questa sezione dipende dal tipo di autorizzazione dell'API di AWS AppSync.

Per ulteriori informazioni suAWS AppSyncopzioni di sicurezza, vediAutorizzazione e autenticazione.

Autorizzazione API_KEY

Laidentityil campo non è popolato.

Autorizzazione AWS_LAMBDA

Laidentityha la seguente forma:

type AppSyncIdentityLambda = { resolverContext: any; };

Ilidentitycontiene ilresolverContextchiave, contenente la stessaresolverContextcontenuto restituito dalla funzione Lambda che autorizza la richiesta.

Autorizzazione AWS_IAM

Ilidentityha la seguente forma:

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

Laidentityha la seguente forma:

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

Ogni campo è definito nel modo seguente:

accountId

LaAWSID dell'account del chiamante.

claims

Le attestazioni dell'utente.

cognitoIdentityAuthType

Autenticato o non autenticato in base al tipo di identità.

cognitoIdentityAuthProvider

Un elenco separato da virgole di informazioni sul provider di identità esterno utilizzato per ottenere le credenziali utilizzate per firmare la richiesta.

cognitoIdentityId

L'ID di identità Amazon Cognito del chiamante.

cognitoIdentityPoolId

L'ID del pool di identità di Amazon Cognito associato al chiamante.

defaultAuthStrategy

La strategia di autorizzazione predefinita per questo chiamante (ALLOW o DENY).

issuer

L'emittente del token.

sourceIp

L'indirizzo IP di origine del chiamante cheAWS AppSyncriceve. Se la richiesta non includex-forwarded-forheader, il valore IP di origine contiene solo un singolo indirizzo IP della connessione TCP. Se la richiesta include un'intestazione x-forwarded-for, l'IP di origine sarà un elenco di indirizzi IP dell'intestazione x-forwarded-for oltre all'indirizzo IP proveniente dalla connessione TCP.

sub

l'UUID dell'utente autenticato.

user

L'utente IAM.

userArn

L'Amazon Resource Name (ARN) dell'utente IAM.

username

Il nome dell'utente autenticato. In caso di autorizzazione AMAZON_COGNITO_USER_POOLS, il valore del nome utente è il valore dell'attributo cognito:username. Nel caso diAWS_IAMautorizzazione, il valore dinome utenteè il valore diAWSutente principale. Se utilizzi l'autorizzazione IAM con credenziali fornite dai pool di identità di Amazon Cognito, ti consigliamo di utilizzarecognitoIdentityId.

Intestazioni delle richieste di accesso

AWS AppSyncsupporta il passaggio di intestazioni personalizzate dai client e l'accesso ad esse nei resolver GraphQL utilizzandoctx.request.headers. È quindi possibile utilizzare i valori dell'intestazione per azioni come l'inserimento di dati in un'origine dati o i controlli di autorizzazione. È possibile utilizzare intestazioni di richiesta singole o multiple utilizzando$curlcon una chiave API dalla riga di comando, come illustrato negli esempi seguenti:

Esempio di intestazione singola

Supponi di impostare un'intestazione custom con il valore nadia come segue:

curl -XPOST -H "Content-Type:application/graphql" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql

Potrai quindi accedervi con ctx.request.headers.custom. Ad esempio, potrebbe essere nel seguente codice per DynamoDB:

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

Esempio di intestazione multipla

Puoi anche passare più intestazioni in una singola richiesta e accedervi nel gestore del resolver. Ad esempio, secustoml'intestazione è impostata con due valori:

curl -XPOST -H "Content-Type:application/graphql" -H "custom:bailey" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql

Potrai quindi accedervi come matrice, ad esempio ctx.request.headers.custom[1].

Nota

AWS AppSyncnon espone l'intestazione del cookie inctx.request.headers.

Accedi al nome di dominio personalizzato della richiesta

AWS AppSyncsupporta la configurazione di un dominio personalizzato che puoi utilizzare per accedere a GraphQL e agli endpoint in tempo reale per le tue API. Quando si effettua una richiesta con un nome di dominio personalizzato, è possibile ottenere il nome di dominio utilizzandoctx.request.domainName.

Quando si utilizza il nome di dominio dell'endpoint GraphQL predefinito, il valore ènull.

Info

La sezione info contiene informazioni sulla richiesta GraphQL. Questa sezione ha il seguente formato:

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

Ogni campo è definito nel modo seguente:

fieldName

Il nome del campo attualmente in corso di risoluzione.

parentTypeName

Il nome del tipo padre per il campo attualmente in corso di risoluzione.

variables

Una mappa contenente tutte le variabili che vengono passate nella richiesta GraphQL.

selectionSetList

Rappresentazione elenco dei campi nel set di selezione GraphQL. I campi con alias sono referenziati solo dal nome dell'alias, non dal nome del campo. L'esempio seguente mostra questa indicazione in dettaglio.

selectionSetGraphQL

Rappresentazione stringa del set di selezione, formattata come SDL (Schema Definition Language) GraphQL. Sebbene i frammenti non vengano uniti nel set di selezione, i frammenti in linea vengono conservati, come illustrato nell'esempio seguente.

Nota

JSON.stringifynon includeràselectionSetGraphQLeselectionSetListnella serializzazione delle stringhe. È necessario fare riferimento direttamente a queste proprietà.

Ad esempio, se stai risolvendo il campo getPost della query seguente:

query { getPost(id: $postId) { postId title secondTitle: title content author(id: $authorId) { authorId name } secondAuthor(id: "789") { authorId } ... on Post { inlineFrag: comments: { id } } ... postFrag } } fragment postFrag on Post { postFrag: comments: { id } }

Quindi il completoctx.infola variabile disponibile durante l'elaborazione di un gestore potrebbe essere:

{ "fieldName": "getPost", "parentTypeName": "Query", "variables": { "postId": "123", "authorId": "456" }, "selectionSetList": [ "postId", "title", "secondTitle" "content", "author", "author/authorId", "author/name", "secondAuthor", "secondAuthor/authorId", "inlineFragComments", "inlineFragComments/id", "postFragComments", "postFragComments/id" ], "selectionSetGraphQL": "{\n getPost(id: $postId) {\n postId\n title\n secondTitle: title\n content\n author(id: $authorId) {\n authorId\n name\n }\n secondAuthor(id: \"789\") {\n authorId\n }\n ... on Post {\n inlineFrag: comments {\n id\n }\n }\n ... postFrag\n }\n}" }

selectionSetListespone solo i campi che appartengono al tipo corrente. Se il tipo corrente è un'interfaccia o un'unione, vengono esposti solo i campi selezionati che appartengono all'interfaccia. Ad esempio, dato lo schema seguente:

type Query { node(id: ID!): Node } interface Node { id: ID } type Post implements Node { id: ID title: String author: String } type Blog implements Node { id: ID title: String category: String }

E la seguente domanda:

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

Quando si chiamactx.info.selectionSetListalQuery.nodesolo risoluzione del campoidè esposto:

"selectionSetList": [ "id" ]