서로 하나씩 여러 파일을 브라우저로 스트리밍하고 싶습니다. 설명하기 위해 여러 개의 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)
});
});
아이디어는 내가
- 필터 밖으로 파일 확장자
.css
이없는 모든 파일을 그. - 모든 디렉토리를 필터링하십시오.
- 파일을 완전히 읽은 후 다음 파일로 진행하십시오.
- 각 파일을 닫지 않고 응답 스트림에 파이프합니다.
- 일단 모든 파일이 파이프되면 응답 스트림을 끝냅니다.
문제는 첫 번째 .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
번을 여러 번 호출 할 수 없으며 한꺼번에 쓸 수 있습니까?
당신이 가지고 올하면 어떤 일이 아닙니다 실제로 파이핑하는 것이 아니기 때문에 버퍼링을하고 출력 스트림에 버퍼를 쓰는 중입니다. 이것은 또 다른 질문에 대한 해답이기도합니다. 데이터를 실제로 출력 스트림으로 파이프하면 write()에 대해 걱정할 필요가 없으며 한 번만 호출 할 수 있습니다. Streamed 2 예제 (https://github.com/Floby)를 검토하여 파이프 된 솔루션을 찾아야합니다. 특히이 코드는 입니다. https://github.com/Floby/node-catstream – vanthome
필자가 작성한 내용에 파이핑이 없다는 것을 알고 있지만 파이핑을 사용하여 해결책을 찾았습니다. 아래 내 대답에서 볼 수 있듯이 문제는 코드에 없었으며 단위 테스트에있었습니다. –