2013-06-13 7 views
7

La seguente riga scaricherà un file immagine da un determinato url variabile:Come concatenare lo stream di scrittura, immediatamente con un flusso di lettura in Node.js 0.10?

var filename = path.join(__dirname, url.replace(/^.*[\\\/]/, '')); 
request(url).pipe(fs.createWriteStream(filename)); 

E queste righe avrà quell'immagine e salvare MongoDB GridFS:

var gfs = Grid(mongoose.connection.db, mongoose.mongo); 
var writestream = gfs.createWriteStream({ filename: filename }); 
fs.createReadStream(filename).pipe(writestream); 

concatenazione pipe come questo getta Errore: 500 Can not Pipe. Non pipeable.

request(url).pipe(fs.createWriteStream(filename)).pipe(writestream); 

Questo accade perché il file immagine non è pronto per essere ancora letto, giusto? Cosa devo fare per ovviare a questo problema? Errore: 500 Can not Pipe. Non pipeable.

Utilizzando il seguente: Node.js 0.10.10, mangusta, richiesta e GridFS-stream biblioteche.

risposta

8
request(url).pipe(fs.createWriteStream(filename)).pipe(writestream); 

è lo stesso di questo:

var fileStream = fs.createWriteStream(filename); 
request(url).pipe(fileStream); 
fileStream.pipe(writestream); 

Quindi il problema è che si sta tentando di .pipe un WriteStream in un altro WriteStream.

+0

Sì, è possibile solo leggere da flussi leggibili o duplex non modificabili. Vedi https://github.com/joyent/node/pull/4843. Per concatenare i tubi, il flusso deve essere duplex, cioè entrambi leggibili e scrivibili – user568109

3

Penso che la confusione nel concatenare le pipe sia causata dal fatto che il metodo pipe "fa scelte" implicitamente su cosa restituire. Cioè:

readableStream.pipe(writableStream) // Returns writable stream 
readableStream.pipe(duplexStream) // Returns readable stream 

Ma la regola generale dice che "Si può solo tubo di uno scrivibile Stream per un flusso leggibile." In altre parole, solo i flussi leggibili hanno il metodo pipe().

4
// create 'fs' module variable 
var fs = require("fs"); 

// open the streams 
var readerStream = fs.createReadStream('inputfile.txt'); 
var writerStream = fs.createWriteStream('outputfile.txt'); 

// pipe the read and write operations 
// read input file and write data to output file 
readerStream.pipe(writerStream); 
+0

In realtà era il contrario: convogliare un flusso leggibile su un flusso scrivibile. – loretoparisi