web-dev-qa-db-ja.com

Node.js 0.10の読み取りストリームですぐに書き込みストリームをチェーンする方法は?

次の行は、指定されたurl変数から画像ファイルをダウンロードします。

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

そして、これらの行はそのイメージを取得し、MongoDBGridFSに保存します。

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

このようにpipeをチェーンするとエラー:500パイプできません。パイプできません。

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

これは、画像ファイルをまだ読み取る準備ができていないために発生しますよね?この問題を回避するにはどうすればよいですか?エラー:500パイプできません。パイプ不可。

以下を使用します:Node.js 0.10.1mongooserequestおよびgridfs-streamライブラリ。

11
Sahat Yalkabov
request(url).pipe(fs.createWriteStream(filename)).pipe(writestream);

これと同じです:

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

したがって、問題は、あるWriteStreamを別のWriteStream.pipeしようとしていることです。

12
loganfsmyth
// 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);
7

パイプをチェーンする際の混乱は、パイプメソッドが何を返すかをそれ自体で暗黙的に「選択」するという事実によって引き起こされていると思います。あれは:

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

ただし、原則として、「書き込み可能なストリームは読み取り可能なストリームにのみパイプできます」とあります。言い換えると、読み取り可能なストリームのみがpipe()メソッドを持っています。

3
mechanicious