2016-08-31 3 views
0

In meiner NodeJs-Anwendung versuche ich, eine HTTP-Datei-URL zu lesen, und lade dann den Inhalt dieser Datei im Streaming herunter.Anfrage von nodejs - Streaming einer Antwortdatei

Was ich tun möchte, ist: - machen in der Datei Ressource anzufordern (Knoten Anfrage-Modul) - wenn das Ansprechen verfügbar wird gestartet, dann beginnen die Daten in Blöcken zu lesen, anstatt haben die heruntergeladene Datei Scheibe ..

ich verstehe, dass die Anforderungsmodul-Streaming unterstützt, und ich habe festgestellt, dass der folgende Code funktioniert:

var request = require('request'); 

var fileUrl = "http://172.19.2.48:8080/files/1472628282006/valid.txt"; 

request(fileUrl, function(err, response, body) {}) 
.on('response', function(response) { 

    /* 
    response.on('readable', function() { 
    console.log("now readable"); 
    var ch; 
    while ((ch=response.read(1))!== null) { 
     console.log("char:", ch); 
    } 
    }); 
    */ 

    response.on('data', function(data) { 
    console.log('data: ', data.toString()); 
    }); 

}); 

Aber einziges Problem ist, ich habe keine Kontrolle über „lesen, wie viel Ich möchte lesen ", da das Ereignis" Daten "alles angibt, was zu diesem Zeitpunkt verfügbar ist. O f Zeit. Stattdessen wollte ich etwas wie eine Leseoperation selbst machen, wie im Code im obigen Snippet.

Dieser Code funktioniert im Allgemeinen für NodeJS Steams 2, aber ich kann es hier nicht funktionieren. Das lesbare Ereignis wird ausgelöst, aber die Leseoperation gibt null zurück. Mein Anwendungsfall ist, ich werde eine Art von strukturierten Daten lesen, und ich werde es analysieren, indem ich ein Char auf einmal mit einem endlichen Automaten lese.

Also, gibt es etwas zu lesen, anstatt von einem "Daten" -Ereignis benachrichtigt zu werden?

Ausgabe, wenn Sie versuchen, lesen. Nur lesbares Ereignis wird empfangen, nachfolgende Lesevorgänge geben null zurück.

[email protected] ~/downloader $ node download.js 
now readable 

bearbeiten Auf den Punkt gebracht, ich möchte die eingehende Antwort Dampf in einem streams2 verwenden können (basierend Strom ziehen) Art und Weise, anstatt Ströme 1 (Push-basiert) eingeben.

Antwort

1

Das Problem ist, der Stream ist im fließenden Modus, so dass alle Daten automatisch gelesen werden. Vielleicht können Sie dies versuchen:

request(fileUrl, function(err, response, body) {}) 
.on('response', function(response) { 
    response.pause(); // <-- Pauses stream so you can pull data on demand 
    response.on('readable', function() { 
    console.log("now readable"); 
    var ch; 
    while ((ch=response.read(1))!== null) { 
     console.log("char:", ch); 
    } 
    }); 
});