Jest to właściwie No.8 ćwiczenia z samouczka node.js ([https://github.com/workshopper/learnyounode][1])W jaki sposób potok (strumień Node.js) i bl (BufferList) współpracują ze sobą?
Cel: Napisz program, który wykonuje żądania HTTP GET do URL dostarczonych do was jako pierwszy Command argument linii. Zbierz wszystkie dane z serwera (nie tylko pierwsze zdarzenie "data"), a następnie napisz dwie linie do konsoli (stdout).
Pierwsza wpisana linia powinna być po prostu liczbą całkowitą reprezentującą liczbę znaków otrzymanych z serwera. Drugi wiersz powinien zawierać kompletny ciąg znaków wysłany przez serwer.
Oto moje rozwiązanie (Przekazuje, ale wygląda gorzej w porównaniu do oficjalnego rozwiązania).
var http = require('http'),
bl = require('bl');
var myBL = new bl(function(err, myBL){
console.log(myBL.length);
console.log(myBL.toString());
});
var url = process.argv[2];
http.get(url, function(res){
res.pipe(myBL);
res.on('end', function(){
myBL.end();
});
});
Oficjalna rozwiązanie:
var http = require('http')
var bl = require('bl')
http.get(process.argv[2], function (response) {
response.pipe(bl(function (err, data) {
if (err)
return console.error(err)
data = data.toString()
console.log(data.length)
console.log(data)
}))
})
mam trudności ze zrozumieniem, jak działa oficjalna rozwiązanie. Mam głównie na dwa pytania:
BL konstruktor spodziewa 2. Argument być instancją bl (zgodnie z dokumentacją bl modułu, [https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-][2]), ale to, co jest dane? Pojawił się znikąd. Powinien być niezdefiniowany kiedy zostanie przekazany do konstruowania instancji bl.
kiedy jest
bl.end()
nazywany? Widzę, że nie ma gdziebl.end()
nazywa ...
nadzieję, że ktoś może rzucić nieco światła na te pytania. (Wiem, że powinienem już odczytać kodu źródłowego, ale wiesz ...)
[1]: https://github.com/workshopper/learnyounode
[2]: https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-
chodzi 'end', zobacz tutaj - https://github.com/rvagg/bl # ctor – levi
Dzięki! W rzeczy samej, moje złe, powinienem uważniej przeczytać dokument. 1) parametr danych jest używany jako parametr wyjściowy, a bl nie wymaga, aby był instancją bl. (Byłem wprowadzony w błąd przez opis tutaj https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array- – slowreader239
2) Dla wywołania end(), w rzeczywistości ma się nazywać przez stream.pipe() https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options – slowreader239