Resolver in AWS AppSync () testen und debuggen JavaScript - AWS AppSync

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.

Resolver in AWS AppSync () testen und debuggen JavaScript

AWS AppSync führt Resolver in einem GraphQL-Feld gegen eine Datenquelle aus. Bei der Arbeit mit Pipeline-Resolvern interagieren Funktionen mit Ihren Datenquellen. Wie in der Übersicht über JavaScript Resolver beschrieben, kommunizieren Funktionen mit Datenquellen, indem sie Anforderungs- und Antworthandler verwenden, die in der Laufzeit geschrieben sind JavaScript und dort ausgeführt werden. APPSYNC_JS Auf diese Weise können Sie vor und nach der Kommunikation mit der Datenquelle benutzerdefinierte Logik und Bedingungen bereitstellen.

Um Entwicklern beim Schreiben, Testen und Debuggen dieser Resolver zu helfen, bietet die AWS AppSync Konsole auch Tools zum Erstellen einer GraphQL-Anfrage und -Antwort mit Scheindaten bis hin zum einzelnen Field-Resolver. Darüber hinaus können Sie Abfragen, Mutationen und Abonnements in der AWS AppSync Konsole durchführen und einen detaillierten Protokollstream der gesamten Anfrage von Amazon einsehen CloudWatch. Dies schließt Ergebnisse aus der Datenquelle ein.

Testen mit Scheindaten

Wenn ein GraphQL-Resolver aufgerufen wird, enthält er ein context Objekt, das relevante Informationen über die Anfrage enthält. Dazu gehören Argumente von einem Client, Identitätsinformationen sowie Daten aus dem übergeordneten GraphQL-Feld. Es speichert auch die Ergebnisse aus der Datenquelle, die im Antworthandler verwendet werden können. Weitere Informationen zu dieser Struktur und den verfügbaren Hilfsprogrammen, die beim Programmieren verwendet werden können, finden Sie in der Resolver-Kontextobjektreferenz.

Beim Schreiben oder Bearbeiten einer Resolverfunktion können Sie ein Modell- oder Testkontextobjekt an den Konsoleneditor übergeben. Auf diese Weise können Sie sehen, wie sowohl der Anforderungs- als auch der Antworthandler ausgewertet werden, ohne dass es tatsächlich mit einer Datenquelle zu tun hat. Beispiel: Sie können ein firstname: Shaggy-Testargument übergeben und sehen, wie es bei der Verwendung von ctx.args.firstname in Ihrem Vorlagencode ausgewertet wird. Sie können auch die Auswertung eines Dienstprogramm-Helferobjekts wie util.autoId() oder util.time.nowISO8601() testen.

Resolver werden getestet

In diesem Beispiel werden Resolver mithilfe der AWS AppSync Konsole getestet.

  1. Melden Sie sich bei der an AWS Management Console und öffnen Sie die AppSyncKonsole.

    1. Wählen Sie im APIsDashboard Ihr GraphQL API aus.

    2. Wählen Sie in der Seitenleiste Funktionen.

  2. Wählen Sie eine bestehende Funktion aus.

  3. Wählen Sie oben auf der Seite „Funktion aktualisieren“ die Option Testkontext auswählen und anschließend Neuen Kontext erstellen aus.

  4. Wählen Sie ein Beispielkontextobjekt aus oder füllen Sie es JSON manuell im Fenster Testkontext konfigurieren unten aus.

  5. Geben Sie einen Namen für den Textkontext ein.

  6. Wählen Sie die Schaltfläche Save (Speichern) aus.

  7. Wählen Sie Run Test (Test ausführen), um den Resolver unter Verwendung dieses Mock-Kontexts auszuwerten.

Ein praktischeres Beispiel: Angenommen, Sie haben eine App, die einen GraphQL-Typ speichertDog, die automatische ID-Generierung für Objekte verwendet und diese in Amazon DynamoDB speichert. Sie möchten auch einige Werte aus den Argumenten einer GraphQL-Mutation schreiben und nur bestimmten Benutzern ermöglichen, eine Antwort zu sehen. Der folgende Ausschnitt zeigt, wie das Schema aussehen könnte:

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

Sie können eine AWS AppSync Funktion schreiben und sie Ihrem addDog Resolver hinzufügen, um die Mutation zu behandeln. Um Ihre AWS AppSync Funktion zu testen, können Sie ein Kontextobjekt wie im folgenden Beispiel auffüllen. Nachstehend werden die Argumente name und age des Clients verwendet und ein username im identity-Objekt mit Daten gefüllt:

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}", "username" : "Nadia", "claims" : { }, "sourceIp" :[ "x.x.x.x" ], "defaultAuthStrategy" : "ALLOW" } }

Sie können Ihre AWS AppSync Funktion mit dem folgenden Code testen:

import { util } from '@aws-appsync/utils'; export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id: util.autoId() }), attributeValues: util.dynamodb.toMapValues(ctx.args), }; } export function response(ctx) { if (ctx.identity.username === 'Nadia') { console.log("This request is allowed") return ctx.result; } util.unauthorized(); }

Der ausgewertete Anforderungs- und Antworthandler enthält die Daten aus Ihrem Testkontextobjekt und den generierten Wert vonutil.autoId(). Wenn Sie username zu einem anderen Wert als Nadia ändern, werden die Ergebnisse nicht zurückgegeben, da die Autorisierungsprüfung fehlschlägt. Weitere Informationen zur detaillierten Zugriffskontrolle finden Sie unter Anwendungsfälle für die Autorisierung.

Testen von Anforderungs- und Antworthandlern mit AWS AppSync APIs

Sie können den EvaluateCode API Befehl verwenden, um Ihren Code aus der Ferne mit gefälschten Daten zu testen. Um mit dem Befehl zu beginnen, stellen Sie sicher, dass Sie die appsync:evaluateMappingCode entsprechende Berechtigung zu Ihrer Richtlinie hinzugefügt haben. Beispielsweise:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateCode", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

Sie können den Befehl nutzen, indem Sie das AWS CLIoder verwenden AWS SDKs. Nehmen wir zum Beispiel das Dog Schema und seine AWS AppSync Funktionsanforderungs- und Antworthandler aus dem vorherigen Abschnitt. Speichern Sie den Code CLI auf Ihrer lokalen Station in einer Datei mit dem Namen code.js und speichern Sie das context Objekt anschließend in einer Datei mit dem Namencontext.json. Führen Sie in Ihrer Shell den folgenden Befehl aus:

$ aws appsync evaluate-code \ --code file://code.js \ --function response \ --context file://context.json \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0

Die Antwort evaluationResult enthält eine, die die von Ihrem Handler zurückgegebene Nutzlast enthält. Es enthält auch ein logs Objekt, das die Liste der Protokolle enthält, die von Ihrem Handler während der Auswertung generiert wurden. Auf diese Weise können Sie Ihre Codeausführung einfach debuggen und Informationen zu Ihrer Evaluierung abrufen, um bei der Fehlerbehebung zu helfen. Beispielsweise:

{ "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}", "logs": [ "INFO - code.js:13:5: \"This request is allowed\"" ] }

Das evaluationResult kann als analysiert werdenJSON, was Folgendes ergibt:

{ "breed": "Miniature Schnauzer", "color": "black_grey" }

Mit dem SDK können Sie ganz einfach Tests aus Ihrer bevorzugten Testsuite integrieren, um das Verhalten Ihrer Handler zu überprüfen. Wir empfehlen, Tests mit dem Jest Testing Framework zu erstellen, aber jede Testsuite funktioniert. Der folgende Ausschnitt zeigt einen hypothetischen Validierungslauf. Beachten Sie, dass wir davon ausgehen, dass die Bewertungsantwort gültig ist. Daher verwenden wirJSON, JSON.parse um sie JSON aus der Zeichenkettenantwort abzurufen:

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0') test('request correctly calls DynamoDB', async () => { const code = fs.readFileSync('./code.js', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

Dies führt zu dem folgenden Ergebnis:

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 totalTime: 1.511 s, estimated 2 s

Debuggen einer Live-Abfrage

Es gibt keinen Ersatz für einen end-to-end Test und eine Protokollierung, um eine Produktionsanwendung zu debuggen. AWS AppSync ermöglicht es Ihnen, Fehler und vollständige Anfragedetails über Amazon zu protokollieren CloudWatch. Darüber hinaus können Sie die AWS AppSync Konsole verwenden, um GraphQL-Abfragen, -Mutationen und -Abonnements zu testen und Protokolldaten für jede Anfrage live zurück in den Abfrage-Editor zu streamen, um sie in Echtzeit zu debuggen. Für Abonnements zeigen die Protokolle Verbindungszeitinformationen an.

Um dies durchzuführen, müssen Sie Amazon CloudWatch Logs im Voraus aktiviert haben, wie unter Überwachung und Protokollierung beschrieben. Wählen Sie als Nächstes in der AWS AppSync Konsole die Registerkarte Abfragen und geben Sie dann eine gültige GraphQL-Abfrage ein. Klicken Sie im unteren rechten Bereich auf das Protokollfenster und ziehen Sie es, um die Protokollansicht zu öffnen. Wählen Sie oben auf der Seite das Wiedergabe-Pfeilsymbol, um die GraphQL-Abfrage auszuführen. In wenigen Augenblicken werden Ihre vollständigen Anfrage- und Antwortprotokolle für den Vorgang in diesen Bereich gestreamt, sodass Sie sie in der Konsole einsehen können.