मैं NodeJS में एक समस्या को हल करने की कोशिश करते समय इस पृष्ठ पर ठोकर खाई: फ़ाइल विखंडू का पुनर्मूल्यांकन। मूल रूप से: मेरे पास फ़ाइलनाम का एक सरणी है। मुझे एक बड़ी फ़ाइल बनाने के लिए, उन सभी फाइलों को सही क्रम में जोड़ना होगा। मुझे यह अनिवार्य रूप से करना चाहिए।
नोड का 'fs' मॉड्यूल appendFileSync प्रदान करता है, लेकिन मैं इस ऑपरेशन के दौरान सर्वर को ब्लॉक नहीं करना चाहता था। मैं fspromises मॉड्यूल का उपयोग करना चाहता था और इस सामान को एक साथ चेन करने का तरीका ढूंढता था। इस पृष्ठ पर दिए गए उदाहरणों ने मेरे लिए बहुत काम नहीं किया क्योंकि मुझे वास्तव में दो कार्यों की आवश्यकता थी: फ़ाइल chunk में पढ़ने के लिए fsPromises.read (), और गंतव्य फ़ाइल पर जाने के लिए fsPromises.appendFile ()। हो सकता है कि अगर मैं जावास्क्रिप्ट के साथ बेहतर होता, तो मैं पिछले उत्तरों को मेरे लिए काम कर सकता था। ;-)
मैं इस पर ठोकर खाई ...
https://css-tricks.com/why-use-reduce-to-fterentially-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 {
}
});
});
मुझे उम्मीद है कि यह किसी की मदद करता है।