View a markdown version of this page

AWS AppSync JavaScript présentation des résolveurs - AWS AppSync GraphQL

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

AWS AppSync JavaScript présentation des résolveurs

AWS AppSync vous permet de répondre aux requêtes GraphQL en effectuant des opérations sur vos sources de données. Pour chaque champ GraphQL sur lequel vous souhaitez exécuter une requête, une mutation ou un abonnement, un résolveur doit être joint.

Les résolveurs sont les connecteurs entre GraphQL et une source de données. Ils expliquent AWS AppSync comment traduire une requête GraphQL entrante en instructions pour votre source de données principale et comment retraduire la réponse de cette source de données en une réponse GraphQL. Avec AWS AppSync, vous pouvez écrire vos résolveurs en utilisant JavaScript et les exécuter dans l'environnement AWS AppSync (APPSYNC_JS).

AWS AppSync vous permet d'écrire des résolveurs d'unités ou des résolveurs de pipeline composés de plusieurs AWS AppSync fonctions dans un pipeline.

Fonctionnalités d'exécution prises en charge

Le AWS AppSync JavaScript moteur d'exécution fournit un sous-ensemble de JavaScript bibliothèques, d'utilitaires et de fonctionnalités. Pour une liste complète des caractéristiques et fonctionnalités prises en charge par le APPSYNC_JS moteur d'exécution, consultez la section Fonctionnalités JavaScript d'exécution pour les résolveurs et les fonctions.

Résolveurs d'unités

Un résolveur d'unités est composé d'un code qui définit un gestionnaire de requêtes et de réponses qui est exécuté sur une source de données. Le gestionnaire de requêtes prend un objet de contexte comme argument et renvoie la charge utile de la demande utilisée pour appeler votre source de données. Le gestionnaire de réponses reçoit une charge utile en retour de la source de données avec le résultat de la demande exécutée. Le gestionnaire de réponses transforme la charge utile en une réponse GraphQL pour résoudre le champ GraphQL. Dans l'exemple ci-dessous, un résolveur extrait un élément d'une source de données DynamoDB :

import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { return ddb.get({ key: { id: ctx.args.id } }); } export const response = (ctx) => ctx.result;

Anatomie d'un résolveur de JavaScript pipelines

Un résolveur de pipeline est composé d'un code qui définit un gestionnaire de requêtes et de réponses et une liste de fonctions. Chaque fonction possède un gestionnaire de requêtes et de réponses qu'elle exécute sur une source de données. Comme un résolveur de pipeline délègue les exécutions à une liste de fonctions, il n'est donc lié à aucune source de données. Les résolveurs d'unité et les fonctions sont des primitifs qui exécutent l'opération sur les sources de données.

Gestionnaire de requêtes Pipeline Resolver

Le gestionnaire de requêtes d'un résolveur de pipeline (étape précédente) vous permet d'exécuter une certaine logique de préparation avant d'exécuter les fonctions définies.

Liste des fonctions

La liste des fonctions d'un résolveur de pipeline est exécutée dans l'ordre. Le résultat de l'évaluation du gestionnaire de requêtes du résolveur de pipeline est mis à la disposition de la première fonction en tant que. ctx.prev.result Le résultat de l'évaluation de chaque fonction est disponible pour la fonction suivante en tant quectx.prev.result.

Gestionnaire de réponses Pipeline Resolver

Le gestionnaire de réponses d'un résolveur de pipeline vous permet d'exécuter une logique finale entre la sortie de la dernière fonction et le type de champ GraphQL attendu. La sortie de la dernière fonction de la liste des fonctions est disponible dans le gestionnaire de réponses du résolveur de pipeline sous forme ctx.prev.result ou. ctx.result

Flux d'exécution

Dans le cas d'un résolveur de pipeline composé de deux fonctions, la liste ci-dessous représente le flux d'exécution lorsque le résolveur est invoqué :

  1. Gestionnaire de requêtes Pipeline Resolver

  2. Fonction 1 : gestionnaire de demandes de fonction

  3. Fonction 1 : Appel de source de données

  4. Fonction 1 : gestionnaire de réponses aux fonctions

  5. Fonction 2 : gestionnaire de demandes de fonction

  6. Fonction 2 : Appel de source de données

  7. Fonction 2 : gestionnaire de réponses aux fonctions

  8. Gestionnaire de réponses Pipeline Resolver

Utilitaires intégrés d'exécution APPSYNC_JS utiles

Les utilitaires suivants peuvent vous aider si vous travaillez avec des résolveurs de pipeline.

ctx.stash

La réserve est un objet qui est mis à disposition dans chaque résolveur et gestionnaire de demandes et de réponses de fonctions. La même instance de stockage est gérée par une seule exécution du résolveur. Cela signifie que vous pouvez utiliser la réserve pour transmettre des données arbitraires entre les gestionnaires de requêtes et de réponses et entre les fonctions d'un résolveur de pipeline. Vous pouvez tester la réserve comme s'il s'agissait d'un JavaScript objet normal.

ctx.prev.result

ctx.prev.result représente le résultat de l'opération précédente exécutée dans le pipeline. Si l'opération précédente était le gestionnaire de requêtes du résolveur de pipeline, il ctx.prev.result est mis à la disposition de la première fonction de la chaîne. Si l'opération précédente est la première fonction, alors ctx.prev.result représente le résultat de la première fonction et il est disponible pour la seconde fonction du pipeline. Si l'opération précédente était la dernière fonction, alors ctx.prev.result représente la sortie de la dernière fonction et est mise à la disposition du gestionnaire de réponses du résolveur de pipeline.

util.error

L'utilitaire util.error est utile pour envoyer une erreur de champ. util.errorL'utilisation de l'intérieur d'un gestionnaire de demande ou de réponse de fonction génère immédiatement une erreur de champ, ce qui empêche l'exécution des fonctions suivantes. Pour plus de détails et d'autres util.error signatures, consultez les fonctionnalités JavaScript d'exécution pour les résolveurs et les fonctions.

Util.Ajouter une erreur

util.appendErrorest similaire àutil.error(), avec la principale particularité qu'il n'interrompt pas l'évaluation du gestionnaire. Au lieu de cela, il signale qu'une erreur s'est produite dans le champ, mais permet au gestionnaire d'être évalué et, par conséquent, de renvoyer des données. L'utilisation de util.appendError dans une fonction ne perturbera pas le flux d'exécution du pipeline. Pour plus de détails et d'autres util.error signatures, consultez les fonctionnalités JavaScript d'exécution des résolveurs et des fonctions.

Runtime.Early Return

La runtime.earlyReturn fonction vous permet de revenir prématurément à partir de n'importe quelle fonction de demande. L'utilisation d'un gestionnaire de requêtes runtime.earlyReturn à l'intérieur d'un résolveur permettra de revenir du résolveur. L'appeler depuis un gestionnaire de demandes de AWS AppSync fonction reviendra depuis la fonction et poursuivra l'exécution vers la fonction suivante du pipeline ou vers le gestionnaire de réponse du résolveur.

Écrire des résolveurs de pipeline

Un résolveur de pipeline possède également un gestionnaire de requêtes et de réponses qui encadrent l'exécution des fonctions du pipeline : son gestionnaire de requêtes est exécuté avant la demande de la première fonction et son gestionnaire de réponse est exécuté après la réponse de la dernière fonction. Le gestionnaire de requêtes du résolveur peut configurer les données à utiliser par les fonctions du pipeline. Le gestionnaire de réponses du résolveur est chargé de renvoyer les données qui correspondent au type de sortie du champ GraphQL. Dans l'exemple ci-dessous, un gestionnaire de requêtes de résolveur définit allowedGroups ; les données renvoyées doivent appartenir à l'un de ces groupes. Cette valeur peut être utilisée par les fonctions du résolveur pour demander des données. Le gestionnaire de réponses du résolveur effectue une dernière vérification et filtre le résultat pour s'assurer que seuls les éléments appartenant aux groupes autorisés sont renvoyés.

import { util } from '@aws-appsync/utils'; /** * Called before the request function of the first AppSync function in the pipeline. * @param ctx the context object holds contextual information about the function invocation. */ export function request(ctx) { ctx.stash.allowedGroups = ['admin']; ctx.stash.startedAt = util.time.nowISO8601(); return {}; } /** * Called after the response function of the last AppSync function in the pipeline. * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { const result = []; for (const item of ctx.prev.result) { if (ctx.stash.allowedGroups.indexOf(item.group) > -1) result.push(item); } return result; }

Ecriture AWS AppSync functions

AWS AppSync les fonctions vous permettent d'écrire une logique commune que vous pouvez réutiliser sur plusieurs résolveurs de votre schéma. Par exemple, vous pouvez avoir une AWS AppSync fonction appelée QUERY_ITEMS qui est chargée d'interroger des éléments à partir d'une source de données Amazon DynamoDB. Pour les résolveurs avec lesquels vous souhaitez interroger des éléments, ajoutez simplement la fonction au pipeline du résolveur et fournissez l'index de requête à utiliser. La logique n'a pas besoin d'être réimplémentée.

Sujets supplémentaires

Rubriques