2013-06-13 4 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.pipeWriteStream를 시도하는 것입니다.

+0

예, 읽기 전용 또는 쓰기가 불가능한 양방향 스트림에서만 읽을 수 있습니다. https://github.com/joyent/node/pull/4843을 참조하십시오. 체인을 연결하려면 스트림이 양방향 (즉, 읽기 및 쓰기 가능)이되어야합니다. – user568109

3

파이프를 연결하는 데있어서의 혼란은 파이프 메소드가 내재적으로 "무엇을 반환 할 것인지"에 대한 선택을한다는 사실 때문에 발생한다고 생각합니다. 즉 :

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

그러나 일반적인 규칙은 말한다 "할 수 있습니다 만 파이프 읽을 수있는 스트림에 쓰기 가능한 스트림입니다." 즉, 읽을 수있는 스트림에만 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

관련 문제