如何使用Node.js 0.10中的读取流立即链接写入流?

Sah*_*bov 11 pipe stream mongoose node.js gridfs

以下行将从指定的url变量下载图像文件:

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

这些行将获取该图像并保存到MongoDB GridFS:

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

链接pipe像这样抛出错误:500无法管道.不可管.

request(url).pipe(fs.createWriteStream(filename)).pipe(writestream);
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为图像文件还没有准备好被读取,对吧?我该怎么做才能解决这个问题?错误:500无法管道.不可管.

使用下面的:Node.js的0.10.10,猫鼬,要求GridFS的流库.

log*_*yth 12

request(url).pipe(fs.createWriteStream(filename)).pipe(writestream);
Run Code Online (Sandbox Code Playgroud)

与此相同:

var fileStream = fs.createWriteStream(filename);
request(url).pipe(fileStream);
fileStream.pipe(writestream);
Run Code Online (Sandbox Code Playgroud)

所以,问题是,你正在尝试.pipe一个WriteStream到另一个WriteStream.

  • 是的,您只能从可读或不可写的双工流中读取。请参阅 https://github.com/joyent/node/pull/4843。要链接管道,流需要是双工的,即可读且可写 (2认同)

小智 7

// 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);
Run Code Online (Sandbox Code Playgroud)