J'utilise node express et postgress. Je ne sais pas si ce que j'essaie de faire est une bonne pratique ou une très grosse erreur. Enregistrez les données dans la base de données de manière asynchrone après avoir déjà renvoyé un résultat au client.

J'ai essayé de le démontrer avec console.log pour vérifier si mon serveur sera bloqué pendant la sauvegarde.

Vous pouvez voir ici status route et statusB route.

  app.get("/statusB", async (req, res) => {
    return res.status(200).send("testAAA");
  });

  app.get("/status", async (req, res) => {
    const userStats = await UserController.getData("id")
    const x = test();

    return res.status(200).send(userStats);
  });

  async function test() {
    return new Promise(() => { 
      for (let x = 0; x < 10000; x++) {

        setTimeout( () => {
          console.log(x)
        }, 5000);
      }
    })
  }

Ce que je devrais souhaiter, c'est si j'envoie /status et juste après l'envoi statusB.

Je m'attends à ce que la sortie soit:
/status renverra les données userStats
/StatusB renvoie "testAAA"
et le compteur fonctionnera de manière asynchrone.


Mais le résultat réel est:
- /status renvoie les données userStats
- Le contre-courant
- /StatusB renvoyer "testAAA" seulement une fois le compteur terminé

Le journal de la console est uniquement un test pour savoir si je peux récupérer et enregistrer des données dans la base de données de manière asynchrone au lieu du journal de la console.

1
G.S 20 juin 2019 à 13:26

3 réponses

Meilleure réponse

Cela dépend de votre analyse de rentabilisation.

Si votre client peut obtenir un code d’état 200 OK même si l’enregistrement a effectivement échoué, vous pouvez le faire de manière asynchrone après avoir répondu.

Dans d'autres cas, vous voudrez effectuer l'enregistrement dans la demande et ne répondre qu'après vous être assuré que tout est sain et sauf.

1
AKX 20 juin 2019 à 10:29

Cela dépend de votre logique si vous voulez par exemple renvoyer la ressource enregistrée au client, vous devez attendre (async/await ou callback) jusqu'à ce que les données soient enregistrées dans la base de données mais par exemple, si vous voulez juste enregistrer une action sans aucun retour sur le frontend, vous pouvez la sauvegarder de manière asynchrone

0
Abderrahim Soubai Elidrissi 20 juin 2019 à 10:32

Oui, vous devez enregistrer les données dans db de manière asynchrone, en raison du fonctionnement de nodejs. Si vous attendez une réponse de db (de manière synchrone), nodejs bloque la boucle d'événements et ne gère pas les nouvelles demandes des clients. MAIS si votre logique métier repose sur le fait que vous devez renvoyer la réponse de la base de données au client, vous devez le faire de manière synchrone et peut-être réfléchir à des solutions de contournement ou choisir un autre runtime, si cela devient un problème.

0
Егор Лебедев 20 juin 2019 à 10:32