Leçon 7 / 15

Retourner une promesse depuis un service

15 min Node.js — API Express et code asynchrone Gratuit

Objectif : Faire remonter le résultat asynchrone d’une recherche de commandes jusqu’au contrôleur.

Une recherche de commandes peut prendre du temps dès que les données proviennent d’une base ou d’un service distant. Si votre service ne fournit pas son résultat sous forme de promesse, le contrôleur ne peut pas s’appuyer sur cette chaîne asynchrone proprement.

Vous allez faire évoluer la liste des commandes pour qu’elle retourne une promesse, puis transmettre cette promesse jusqu’au contrôleur. La route reste reliée au contrôleur comme à la fin de la leçon précédente.

Faire retourner une promesse au service

Pour l’instant, la liste du projet est vide. Remplacez le contenu de services/commandes.js par le module ci-dessous. Promise.resolve fournit une promesse déjà résolue avec la liste : le contrôleur recevra donc le résultat sous une forme qui pourra aussi représenter une opération réellement asynchrone.

services/commandes.jsJavaScript
function lister() {
  const commandes = [];
  return Promise.resolve(commandes);
}

module.exports = {
  lister
};
Aperçu du rendu
Chargement de l'aperçu…

La fonction lister retourne maintenant une promesse, et non directement le tableau. Le service garde la responsabilité de fournir les commandes ; il ne connaît ni Express ni la réponse HTTP. Ici, la promesse est résolue immédiatement, mais le contrat de retour sera le même lorsque la récupération des données sera asynchrone.

Transmettre le résultat au contrôleur

Le contrôleur doit attendre que la promesse soit résolue avant de construire la réponse JSON. Avec then, vous fournissez une fonction qui reçoit la liste obtenue. Remplacez le contenu de controleurs/commandes.js par cette version complète, en conservant le format normalisé défini dans la leçon « Lire les requêtes et formater les réponses ».

controleurs/commandes.jsJavaScript
const commandesService = require('../services/commandes');

function lister(req, res) {
  return commandesService.lister().then((commandes) => {
    res.status(200).json({
      donnees: commandes,
      erreur: null
    });
  });
}

module.exports = {
  lister
};
Aperçu du rendu
Chargement de l'aperçu…

Le contrôleur retourne à son tour la promesse créée par then. La fonction passée à then reçoit les commandes et envoie la réponse lorsque le résultat est disponible. La route n’a pas à connaître le détail de cette attente : elle reste associée à lister, comme auparavant.

Vérifier le comportement

Redémarrez le serveur avec votre commande habituelle, puis envoyez une requête GET à /api/commandes. La réponse contient un tableau vide, comme avant, mais le résultat a désormais parcouru une chaîne de promesses entre le service et le contrôleur. Le statut et l’enveloppe JSON restent inchangés.

Résultat attenduTexte
HTTP/1.1 200 OK
Content-Type: application/json
Résultat attendu
{
  "donnees": [],
  "erreur": null
}

Vous n’avez pas besoin de modifier le routeur ni serveur.js pour cette étape. L’organisation route-contrôleur-service reste celle mise en place précédemment ; seule la manière dont le service fournit le résultat a changé.

À retenir

  • Un service peut retourner une promesse au lieu de fournir immédiatement sa valeur.
  • Le contrôleur utilise then pour recevoir le résultat résolu et construire la réponse HTTP.
  • Retournez la promesse depuis le contrôleur afin que l’opération reste suivable par la couche appelante.
  • Le traitement des rejets sera centralisé dans une prochaine leçon.

Dans la leçon suivante, vous remplacerez cette chaîne explicite avec then par un contrôleur utilisant async et await.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.