DataLoader

NestJS 🔴 Senior

Définition

Utilitaire qui regroupe et met en cache les requêtes de base de données dans une exécution GraphQL. Résout le problème classique N+1.

Analogie

Comme un livreur qui regroupe toutes les commandes d'un quartier en une seule tournée au lieu de faire un aller-retour par colis.

Exemple de code

@Injectable({ scope: Scope.REQUEST })
export class UserLoader {
  private loader = new DataLoader<number, User>(async (ids) => {
    const users = await this.userService.findByIds([...ids]);
    return ids.map(id => users.find(u => u.id === id));
  });
  load(id: number) { return this.loader.load(id); }
}

Cas d'usage

Optimiser les resolvers GraphQL en batchant les requêtes par entité pour éviter le N+1.

Anti-pattern

Charger les relations une par une dans chaque resolver sans DataLoader.
#communication#interview

En entretien

  1. Explique-moi à quoi sert DataLoader dans un contexte GraphQL.

    Il regroupe et met en cache les requêtes base de données au sein d'une même exécution GraphQL, ce qui résout le problème classique du N+1. C'est comme un livreur qui regroupe toutes les commandes d'un quartier en une seule tournée plutôt qu'un aller-retour par colis.

  2. Quel est l'anti-pattern que DataLoader vient corriger ?

    Charger les relations une par une dans chaque resolver sans DataLoader, ce qui multiplie les requêtes vers la base à chaque niveau de résolution GraphQL.

  3. Pourquoi le scope REQUEST est important pour un DataLoader ?

    Parce que son cache doit être remis à zéro à chaque requête GraphQL, sinon on risquerait de mélanger des données batchées entre différentes requêtes ou utilisateurs.

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre