2013-03-09 6 views
3

서로 하나씩 여러 파일을 브라우저로 스트리밍하고 싶습니다. 설명하기 위해 여러 개의 CSS 파일을 하나씩 연결하여 전달하는 방법을 생각해보십시오.Node.js를 사용하여 여러 파일 스트림을 파이핑

내가 사용하고있는 코드는 다음과 같습니다

var directory = path.join(__dirname, 'css'); 
fs.readdir(directory, function (err, files) { 
    async.eachSeries(files, function (file, callback) { 
    if (!endsWith(file, '.css')) { return callback(); } // (1) 

    var currentFile = path.join(directory, file); 
    fs.stat(currentFile, function (err, stats) { 
     if (stats.isDirectory()) { return callback(); } // (2) 

     var stream = fs.createReadStream(currentFile).on('end', function() { 
     callback(); // (3) 
     }); 
     stream.pipe(res, { end: false }); // (4) 
    }); 
    }, function() { 
    res.end(); // (5) 
    }); 
}); 

아이디어는 내가

  1. 필터 밖으로 파일 확장자 .css이없는 모든 파일을 그.
  2. 모든 디렉토리를 필터링하십시오.
  3. 파일을 완전히 읽은 후 다음 파일로 진행하십시오.
  4. 각 파일을 닫지 않고 응답 스트림에 파이프합니다.
  5. 일단 모든 파일이 파이프되면 응답 스트림을 끝냅니다.

문제는 첫 번째 .css 파일 만 파이프되며 나머지 파일은 모두 누락되는 것입니다. 마치 (3)이 첫 번째 (4) 다음에 (5)로 직접 점프하는 것과 같습니다.

흥미로운 점은 그 내가

stream.on('data', function (data) { 
    console.log(data.toString('utf8')); 
}); 

모든 것을 라인 (4)를 대체 할 경우 예상대로 작동 : 나는 여러 파일을 참조하십시오. 이 코드를

stream.on('data', function (data) { 
    res.write(data.toString('utf8')); 
}); 

으로 변경하면 모든 파일이 첫 번째 파일을 다시 찾을 수 있습니다.

내가 뭘 잘못하고 있니?

추 신 : 오류는 Node.js 0.8.7과 0.8.22를 사용하여 발생합니다.

var directory = path.join(__dirname, 'css'); 
fs.readdir(directory, function (err, files) { 
    var concatenated = ''; 
    async.eachSeries(files, function (file, callback) { 
    if (!endsWith(file, '.css')) { return callback(); } 

    var currentFile = path.join(directory, file); 
    fs.stat(currentFile, function (err, stats) { 
     if (stats.isDirectory()) { return callback(); } 

     var stream = fs.createReadStream(currentFile).on('end', function() { 
     callback(); 
     }).on('data', function (data) { concatenated += data.toString('utf8'); }); 
    }); 
    }, function() { 
    res.write(concatenated); 
    res.end(); 
    }); 
}); 

:하지만 이유를 다음과 같이 코드를 변경하는 경우

좋아 UPDATE, 그것은 작동? 왜 처음에 모든 청크를 합산하는 대신 res.write 번을 여러 번 호출 할 수 없으며 한꺼번에 쓸 수 있습니까?

+2

당신이 가지고 올하면 어떤 일이 아닙니다 실제로 파이핑하는 것이 아니기 때문에 버퍼링을하고 출력 스트림에 버퍼를 쓰는 중입니다. 이것은 또 다른 질문에 대한 해답이기도합니다. 데이터를 실제로 출력 스트림으로 파이프하면 write()에 대해 걱정할 필요가 없으며 한 번만 호출 할 수 있습니다. Streamed 2 예제 (https://github.com/Floby)를 검토하여 파이프 된 솔루션을 찾아야합니다. 특히이 코드는 입니다. https://github.com/Floby/node-catstream – vanthome

+0

필자가 작성한 내용에 파이핑이 없다는 것을 알고 있지만 파이핑을 사용하여 해결책을 찾았습니다. 아래 내 대답에서 볼 수 있듯이 문제는 코드에 없었으며 단위 테스트에있었습니다. –

답변

0

이 코드는이

가 고정 잘못 단위 테스트 ...했다, 완벽하게 정상적으로, 그리고 지금은 샤름의 :-)처럼 작동

관련 문제