NodeJS에서 문제를 해결하려고 시도 하면서이 페이지를 우연히 발견했습니다 : 파일 청크의 재 조립. 기본적으로 : 파일 이름 배열이 있습니다. 하나의 큰 파일을 만들려면 모든 파일을 올바른 순서로 추가해야합니다. 이 작업을 비동기 적으로 수행해야합니다.
노드의 'fs'모듈은 appendFileSync를 제공하지만이 작업 중에 서버를 차단하고 싶지 않습니다. fs.promises 모듈을 사용하고이 것들을 서로 연결하는 방법을 찾고 싶었습니다. 파일 청크에서 읽을 fsPromises.read ()와 대상 파일에 연결하기 위해 fsPromises.appendFile ()의 두 가지 작업이 실제로 필요했기 때문에이 페이지의 예제가 제대로 작동하지 않았습니다. 어쩌면 내가 자바 스크립트에 더 좋으면 이전 답변이 효과가 있었을 것입니다. ;-)
나는 이것을 우연히 발견했다 ...
https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/
... 그리고 나는 작업 솔루션을 함께 해킹 할 수있었습니다.
TLDR :
/**
* sequentially append a list of files into a specified destination file
*/
exports.append_files = function (destinationFile, arrayOfFilenames) {
return arrayOfFilenames.reduce((previousPromise, currentFile) => {
return previousPromise.then(() => {
return fsPromises.readFile(currentFile).then(fileContents => {
return fsPromises.appendFile(destinationFile, fileContents);
});
});
}, Promise.resolve());
};
자스민 단위 테스트는 다음과 같습니다.
const fsPromises = require('fs').promises;
const fsUtils = require( ... );
const TEMPDIR = 'temp';
describe("test append_files", function() {
it('append_files should work', async function(done) {
try {
// setup: create some files
await fsPromises.mkdir(TEMPDIR);
await fsPromises.writeFile(path.join(TEMPDIR, '1'), 'one');
await fsPromises.writeFile(path.join(TEMPDIR, '2'), 'two');
await fsPromises.writeFile(path.join(TEMPDIR, '3'), 'three');
await fsPromises.writeFile(path.join(TEMPDIR, '4'), 'four');
await fsPromises.writeFile(path.join(TEMPDIR, '5'), 'five');
const filenameArray = [];
for (var i=1; i < 6; i++) {
filenameArray.push(path.join(TEMPDIR, i.toString()));
}
const DESTFILE = path.join(TEMPDIR, 'final');
await fsUtils.append_files(DESTFILE, filenameArray);
// confirm "final" file exists
const fsStat = await fsPromises.stat(DESTFILE);
expect(fsStat.isFile()).toBeTruthy();
// confirm content of the "final" file
const expectedContent = new Buffer('onetwothreefourfive', 'utf8');
var fileContents = await fsPromises.readFile(DESTFILE);
expect(fileContents).toEqual(expectedContent);
done();
}
catch (err) {
fail(err);
}
finally {
}
});
});
누군가에게 도움이되기를 바랍니다.