2013-06-13 10 views
7

指定url変数からイメージファイルをダウンロードします次の行:その画像を撮影し、MongoDBのGridFSに保存されますNode.js 0.10でストリームを読み書きして直ちに書き込みストリームをチェーンする方法は?

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

そして、これらの行:このようなpipeの連鎖

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

をスローしますエラー:500パイプできません。パイプではありません。

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

画像ファイルがまだ読み込み可能な状態ではないので、これは右、どうなりますか?この問題を回避するにはどうすればよいですか?エラー:500パイプできません。パイプではありません。

次の使用:のNode.js 0.10.10マングース要求gridfsストリームライブラリ。

答えて

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

はこれと同じである:

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

だから、問題はあなたが別のWriteStreamにしようとしているということです。

+0

はい、書き込み可能ではない読み取り可能なストリームまたはデュプレックスストリームからのみ読み取り可能です。 https://github.com/joyent/node/pull/4843を参照してください。パイプを連鎖させるには、ストリームはデュプレックス(すなわち、読み書き可能)の両方でなければならない。 – user568109

3

私はパイプをチェーンでの混乱がパイプ方式は、暗黙的に返すかにそれ自身の「選択肢を作る」という事実に起因していると思います。つまり、「書き込み可能なストリームを読み込み可能なストリームにパイプすることしかできません」という一般的なルールがあります。言い換えれば、読み取り可能なストリームだけが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

実際には反対である:読み込み可能なストリームを書き込み可能なストリームにパイプする。 – loretoparisi

関連する問題