2014-06-29 3 views
1

J'essaie d'obtenir des données d'un service tiers en utilisant le module de requête de nœud et de renvoyer ces données sous forme de chaîne à partir d'une fonction. Ma perception était que request() retourne un flux lisible puisque vous pouvez faire request(...).pipe(writeableStream) qui - je pensais - implique que je peux fairePourquoi does.on() ne fonctionne pas dans Node.js

function getData(){ 
    var string; 

    request('someurl') 
     .on('data', function(data){ 
      string += data; 
     }) 
     .on('end', function(){ 
      return string; 
     }); 
} 

mais cela ne fonctionne pas vraiment. Je pense que j'ai une fausse perception de la façon dont fonctionnent les requêtes() ou les flux de nœuds. Quelqu'un peut-il clarifier ma confusion ici?

Répondre

3

Cela fonctionne exactement comme vous l'avez expliqué. Peut-être que le problème que vous rencontrez est dû à la nature asynchrone de node.js. Je suis sûr que vous appelez votre getData() de manière synchrone. Essayez et voir si vous êtes request appel ne retourne pas quelque chose:

request('someurl') 
    .on('data', function(data){ 
    console.log(data.toString()); 
    .on('end', function(){ 
    console.log("This is the end..."); 
    }); 

Jetez un oeil à ce morceau de l'article here. Ce n'est pas court, mais cela explique comment écrire votre code pour faire face à ce genre de situation.

+0

Merci beaucoup pour votre réponse! Le comportement bizarre était 1. parce que je n'avais pas la méthode .toString() donc j'ai eu une sortie bizarre et 2. Je l'appelais comme vous l'avez dit correctement synchrone. Je ne suis pas vraiment sûr de la façon dont je devrais l'appeler de manière asynchrone tout en étant capable de renvoyer les données reçues. La seule idée que je peux trouver est de passer un rappel à la fonction getData() qui est appelée quand l'événement 'end' est émis et de lui transmettre les données '.on ('end', funciton() {callback (allData);}) 'Y a-t-il d'autres possibilités? – Flavio

+0

Oui, vous avez le point: les rappels. C'est la "manière de nœud" de faire les choses. À mon humble avis, voici comment vous devriez gérer cela: appelez le rappel à l'intérieur de l'événement 'end'. –

+0

Super merci! – Flavio

1

Ce que je reçois, c'est que vous voulez accéder à string plus tard et vous pensiez que le request retournerait une chaîne complétée. Si oui, vous ne pouvez pas le faire de façon synchrone, vous devez mettre votre code pour traiter le string terminé dans le gestionnaire d'événements end comme ceci:

function getData(){ 
    var string; 

    request('someurl') 
     .on('data', function(data){ 
      string += data; 
     }) 
     .on('end', function(){ 
      processString(string); 
     }); 
} 
getData(); 
+0

Nice, merci! Ouais j'ai pensé que ça pourrait être le problème. Pouvez-vous commenter sur mon commentaire ci-dessus? Wold passant dans un rappel est une bonne solution pour récupérer les données de toute façon? – Flavio

+0

Callbacks est la solution la plus utilisée pour gérer le code async en dehors de pubsub/event, promesses, générateurs, etc. Vous découvrirez bientôt l'horrible "callback pyramid" et vous aurez besoin d'une bibliothèque pour rationaliser votre code avant ES6. venir. J'ai besoin de 50 reps pour commenter donc je ne pourrais pas faire cela, désolé. – user3102569

Questions connexes