2013-06-13 23 views
7

Các dòng sau sẽ tải về một tập tin hình ảnh từ một quy định url biến:Làm thế nào để chuỗi ghi luồng, ngay lập tức với một dòng đọc trong Node.js 0.10?

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

Và những dòng này sẽ mất hình ảnh đó và lưu vào MongoDB GridFS:

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

Chaining pipe như thế này ném Lỗi: 500 không thể ống. Không có đường ống.

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

Điều này xảy ra bởi vì các tập tin hình ảnh chưa sẵn sàng để được đọc bài viết nào, phải không? Tôi nên làm gì để giải quyết vấn đề này? Lỗi: 500 Không thể ống. Không có đường ống.

Sử dụng như sau: Node.js 0.10.10, mongoose, yêu cầugridfs dòng thư viện.

Trả lời

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

cũng giống như thế này:

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

Vì vậy, vấn đề là bạn đang cố gắng .pipe một WriteStream vào WriteStream khác.

+0

Có, bạn chỉ có thể đọc từ các luồng có thể đọc hoặc song công không thể ghi được. Xem https://github.com/joyent/node/pull/4843. Để chuỗi đường ống, luồng cần phải song công tức là cả hai có thể đọc được và có thể ghi được – user568109

3

Tôi nghĩ rằng sự nhầm lẫn trong chuỗi các đường ống được gây ra bởi thực tế là phương pháp đường ống ngầm "làm cho sự lựa chọn" trên đó là của riêng mình về những gì để trở về. Đó là:

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

Nhưng quy tắc chung nói rằng "Bạn chỉ có thể gửi luồng có thể ghi vào luồng có thể đọc". Nói cách khác, chỉ các luồng có thể đọc mới có phương thức 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

Thực ra điều ngược lại: ống là luồng có thể đọc được thành luồng có thể ghi. – loretoparisi

Các vấn đề liên quan