Questo è in realtà l'esercizio No.8 dal tutorial Node.js ([https://github.com/workshopper/learnyounode][1])In che modo pipe (stream of Node.js) e bl (BufferList) funzionano insieme?
L'obiettivo: Scrivete un programma che esegue una richiesta HTTP GET a un URL fornito a voi come il primo Comando- argomento di linea. Raccogli tutti i dati dal server (non solo il primo evento "dati") e quindi scrivi due righe sulla console (stdout).
La prima riga che scrivi dovrebbe essere solo un numero intero che rappresenta il numero di caratteri ricevuti dal server. La seconda riga dovrebbe contenere la stringa completa di caratteri inviati dal server.
Quindi ecco la mia soluzione (Passa ma sembra più brutta rispetto alla soluzione ufficiale).
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();
});
});
La soluzione ufficiale:
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)
}))
})
ho difficoltà a capire come funziona la soluzione ufficiale. Ho principalmente due domande:
Il costruttore bl si aspetta che il secondo argomento sia un'istanza di bl (secondo la documentazione del modulo bl, [https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-][2]), ma ciò che è dati? È venuto fuori dal nulla. Dovrebbe essere non definito quando viene passato per costruire l'istanza bl.
quando è
bl.end()
chiamato? Non vedo dove che labl.end()
si chiama ...
La speranza che qualcuno possa fare luce su queste domande. (So che avrei dovuto leggere il codice sorgente, ma non si sa ...)
[1]: https://github.com/workshopper/learnyounode
[2]: https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-
Per quanto riguarda 'FINE', vedi qui - https://github.com/rvagg/bl # ctor – levi
Grazie a entrambi! Anzi, mio cattivo, avrei dovuto leggere il documento con più attenzione. 1) il parametro data viene utilizzato come parametro di uscita e bl non richiede che sia un'istanza di bl. (Sono stato fuorviato dalla descrizione qui https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array- – slowreader239
2) Per la chiamata end(), in effetti dovrebbe essere chiamata di stream.pipe() https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options – slowreader239