Node.js, Express.js - Temps de calcul trop long avant le retour JSON

Erreur dans le client

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

je développe un projet en Angular 2+ et Node.js.

Pour la partie Node.js, j’ai une route qui prends un fichier (une vidéo) en paramètre et la télécharge sur youtube. Le problème est que si la vidéo est un peu longue (à partir de 3 - 4 minutes), le navigateur m’affiche une erreur sur la requête, or le calcul est toujours en cours et à la fin de celui-ci la vidéo sera bien correctement téléchargée.

Au niveau du code c’est tout simple, j’utilise l’API Youtube pour insérer ma vidéo, puis lorsque c’est OK, je renvois une réponse comme ceci :

res.status(data.code);
res.send(data);

J’ai déjà essayé d’uliser les event streams selon cette réponse, maisje n’arrive pas à envoyer des informations avec res.write(), de plus je n’arrive pas non plus à arrêter la requête avec res.end() après avoir renvoyé le résultat final.

Quelqu’un aurait-il une solution ? Merci

+0 -0
Auteur du sujet

Ca ne fonctionne pas. Par exemple, j’ai cette route pour tester :

router.post('/interval', (req, res) => {
  let i = 0;

  const interval = setInterval(() => {
    if (i < 120) {
      console.log('i = ' + i);
      res.write('');
    } else {
      clearInterval(interval);
      res.status(200);
      res.write(JSON.stringify({ status: 'done' }));
      res.end();
    }

    i += 1;
  }, 1000);
});

Avec i < 120, j’ai le même soucis. Par contre si je met i < 10 ça passe. Que faut-il faire ?

+0 -0

Il faudrait faire :

res.write("[");
res.write(JSON.stringify({ status: 'done' })+",");
res.write(JSON.stringify({ status: 'done' })+",");
res.write(JSON.stringify({ status: 'done' })+",");
res.write(JSON.stringify({ status: 'done' }));
res.write("]");

FAUX! Voir ci-dessous.

Édité par A-312

+0 -0

Salut,

Sinon, au lieu de faire charger ta page progressivement, tu retournes une page qui ne contient pas les données nécessaires et tu établis une connexion websocket par la suite pour récupérer les données. Il suffit de générer un code unique pour la page qu’elle passera à la connexion websocket à l’initialisation de celle-ci. Le serveur saura donc quelle vidéo il doit envoyer.

Ah! J’ai oublié d’éditer mon message, juste après avoir posté mon message, j’ai réalisé que ce que j’ai fais en haut était faux. Il ne passera pas car on ne peut pas lire au fur et à mesure un JSON. A part avec un HACK avec un élément HTML du style :

<p id="p1" data-json="{ status: 'done' }"></p>
<p id="p2"  data-json="{ status: 'done' }"></p>
<p id="p3"  data-json="{ status: 'done' }"></p>
<p id="p4"  data-json="{ status: 'done' }"></p>

Et suivre xhr.onreadystatechange mais ma réponse sur streamer le contenu était pour ta vidéo et non pour ton json. Sinon la meilleure méthode est de faire plusieurs requêtes ajax selon le besoin et d’envoyer un json par requete.

J’avais compris de tes explications que data dans res.send(data); était ta vidéo.

Édité par A-312

+0 -0
Auteur du sujet

Je tiens à clarifier que ce que j’essaie de faire c’est uploader une vidéo sur youtube depuis mon application. Et mon API Node.js retourne donc le résultat après l’upload, d’où le problème de temps.

Sinon, j’ai réussi à trouver une solution en utilisant req.setTimeout(0) avant le traitement. Je ne sais pas si c’est la meilleure chose à faire, mais ça résout mon problème en tout cas

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte