Beispiel für einen Pipeline-Resolver mit Amazon DynamoDB - AWS AppSync GraphQL

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispiel für einen Pipeline-Resolver mit Amazon DynamoDB

Angenommen, Sie möchten einen Pipeline-Resolver an ein Feld mit dem Namen anhängengetPost(id:ID!), das einen Post Typ aus einer Amazon DynamoDB DynamoDB-Datenquelle mit der folgenden GraphQL-Abfrage zurückgibt:

getPost(id:1){ id title content }

Hängen Sie zunächst einen einfachen Resolver mit dem folgenden Code anQuery.getPost. Dies ist ein Beispiel für einfachen Resolver-Code. Im Request-Handler ist keine Logik definiert, und der Response-Handler gibt einfach das Ergebnis der letzten Funktion zurück.

/** * Invoked **before** the request handler of the first AppSync function in the pipeline. * The resolver `request` handler allows to perform some preparation logic * before executing the defined functions in your pipeline. * @param ctx the context object holds contextual information about the function invocation. */ export function request(ctx) { return {} } /** * Invoked **after** the response handler of the last AppSync function in the pipeline. * The resolver `response` handler allows to perform some final evaluation logic * from the output of the last function to the expected GraphQL field type. * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { return ctx.prev.result }

Definieren Sie als Nächstes eine FunktionGET_ITEM, die ein Postitem aus Ihrer Datenquelle abruft:

import { util } from '@aws-appsync/utils' import * as ddb from '@aws-appsync/utils/dynamodb' /** * Request a single item from the attached DynamoDB table datasource * @param ctx the context object holds contextual information about the function invocation. */ export function request(ctx) { const { id } = ctx.args return ddb.get({ key: { id } }) } /** * Returns the result * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { const { error, result } = ctx if (error) { return util.appendError(error.message, error.type, result) } return ctx.result }

Wenn während der Anfrage ein Fehler auftritt, hängt der Antworthandler der Funktion einen Fehler an, der in der GraphQL-Antwort an den aufrufenden Client zurückgegeben wird. Fügen Sie die GET_ITEM Funktion zu Ihrer Liste der Resolver-Funktionen hinzu. Wenn Sie die Abfrage ausführen, verwendet der Request-Handler der GET_ITEM Funktion die vom DynamoDB-Modul bereitgestellten AWS AppSync Utils, um eine DynamoDBGetItem Anfrage mit dem id als Schlüssel zu erstellen. ddb.get({ key: { id } })generiert die entsprechende Operation: GetItem

{ "operation" : "GetItem", "key" : { "id" : { "S" : "1" } } }

AWS AppSync verwendet die Anfrage, um die Daten von Amazon DynamoDB abzurufen. Sobald die Daten zurückgegeben wurden, werden sie vom Response-Handler der GET_ITEM Funktion verarbeitet, der nach Fehlern sucht und dann das Ergebnis zurückgibt.

{ "result" : { "id": 1, "title": "hello world", "content": "<long story>" } }

Schließlich gibt der Response-Handler des Resolvers das Ergebnis direkt zurück.

Mit Fehlern arbeiten

Wenn in Ihrer Funktion während einer Anfrage ein Fehler auftritt, wird der Fehler in Ihrem Funktionsantwort-Handler unter verfügbar gemachtctx.error. Sie können den Fehler mit dem Hilfsprogramm an Ihre GraphQL-Antwort anhängen. util.appendError Sie können den Fehler mithilfe des Stash für andere Funktionen in der Pipeline verfügbar machen. Sehen Sie sich das folgende Beispiel an:

/** * Returns the result * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { const { error, result } = ctx; if (error) { if (!ctx.stash.errors) ctx.stash.errors = [] ctx.stash.errors.push(ctx.error) return util.appendError(error.message, error.type, result); } return ctx.result; }