7
votes

Apollo Server: dataSources vs contexte pour l'utiliser avec une base de données

Après avoir lu cette documentation Je ne sais pas si d'utiliser un contexte simple, comme je l'ai fait d'autres fois, ou s'il vaut mieux utiliser dataSources pour gérer la base de données.

DataSource est le bon moyen de communiquer avec la base de données ou il vaut mieux l'utiliser uniquement pour communiquer avec une API REST?

En gros, est-il avantageux d'utiliser les sources de données par rapport au contexte dans ce cas?


0 commentaires

3 Réponses :


0
votes

Si vous regardez le documentation que vous avez signalée. Vous ajoutez des sources de données lors de l'initialisation d'Apollo Server comme ceci:

module.exports = {
  Query: {
    launches: (_, __, { dataSources }) =>
      dataSources.launchAPI.getAllLaunches(),
    launch: (_, { id }, { dataSources }) =>
      dataSources.launchAPI.getLaunchById({ launchId: id }),
    me: (_, __, { dataSources }) => dataSources.userAPI.findOrCreateUser()
  }
};

et c'est à cause de cela que dataSources devient la partie du contexte. Si vous vous souvenez, vous procédez à la déstructuration du contexte pour exposer les sources de données comme indiqué ici

const server = new ApolloServer({
  typeDefs,
  dataSources: () => ({
    launchAPI: new LaunchAPI(),
    userAPI: new UserAPI({ store })
  })
});

Si vous souhaitez accéder à l'instance d'une source de données telle que UserAPI ou LaunchAPI, vous devrez le faire avec dataSources.userAPI


0 commentaires

0
votes

Je pense qu'il est préférable d'utiliser DataSource (comme son nom l'indique) et il pourrait être facile d'ajouter une couche de mise en cache par-dessus. Vous pouvez créer une classe DBDataSource étendant la classe DataSource car Apollo ne fournit aucune classe DBDataSource .

La classe

DataSource est une classe de source de données Apollo générique, tandis que la classe RESTDataSource est responsable de la récupération des données à partir d'une API REST.

Donc, pour récupérer les données des API restantes, il est préférable d'utiliser RESTDataSource .

Créer une source de données personnalisée < / a>

Apollo ne prend pas encore en charge une source de données SQL (bien que nous serions ravis de vous guider si vous souhaitez contribuer), nous devrons donc créer une source de données personnalisée pour notre base de données en étendant le classe de source de données Apollo générique. Vous pouvez créer le vôtre avec le package apollo-datasource .

Voici quelques-uns des concepts de base pour créer votre propre source de données:

  1. La méthode initialize: vous devrez implémenter cette méthode si vous souhaitez transmettre des options de configuration à votre classe. Ici, nous utilisons cette méthode pour accéder au contexte de notre API graphique.
  2. this.context: le contexte d'une API graphique est un objet qui est partagé entre chaque résolveur dans une requête GraphQL. Nous allons expliquer cela plus en détail dans la section suivante. Pour l'instant, tout ce que vous devez savoir, c'est que le contexte est utile pour stocker les informations utilisateur.
  3. Mise en cache: alors que la source de données REST est livrée avec son propre cache intégré, la source de données générique ne le fait pas. Cependant, vous pouvez utiliser nos primitives de cache pour créer les vôtres!

0 commentaires

0
votes

Je garde généralement les résolveurs très fins, je passe les arguments entrants aux dataSources et ils font communiquer les modèles et les chargeurs. La plupart de la logique et des validations se trouvent dans des modèles. Vous pouvez bien sûr créer vos propres règles telles que "n'appelez pas une autre source de données à l'intérieur d'une source de données. Passez leur sortie pour les faire communiquer via des résolveurs", etc. Ce n'est qu'un exemple bien sûr. Je ne suis pas une règle stricte. Il peut y avoir de meilleures solutions et en fait, pour des choses simples, utiliser directement des modèles est beaucoup plus simple. Mais les dataSources vous aident à garder les choses organisées et si vous voulez ajouter de la mise en cache, etc., vous pouvez créer une BaseDataSource, y mettre toute la logique et simplement l'étendre avec d'autres dataSources.


0 commentaires