Je suis tombé sur cette page en essayant de résoudre un problème dans NodeJS: réassemblage de morceaux de fichiers. Fondamentalement: j'ai un tableau de noms de fichiers. Je dois ajouter tous ces fichiers, dans le bon ordre, pour créer un seul gros fichier. Je dois le faire de manière asynchrone.
Le module 'fs' de Node fournit appendFileSync mais je ne voulais pas bloquer le serveur pendant cette opération. Je voulais utiliser le module fs.promises et trouver un moyen d'enchaîner ces choses. Les exemples de cette page ne fonctionnaient pas tout à fait pour moi car j'avais en fait besoin de deux opérations: fsPromises.read () pour lire le bloc de fichier et fsPromises.appendFile () pour concaténer le fichier de destination. Peut-être que si j'étais meilleur avec javascript, j'aurais pu faire fonctionner les réponses précédentes pour moi. ;-)
Je suis tombé sur ceci ...
https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/
... et j'ai pu pirater ensemble une solution de travail.
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());
};
Et voici un test unitaire de jasmin pour cela:
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 {
}
});
});
J'espère que cela aide quelqu'un.