Node.js how to read a file and then write the same file with two separate functions?
javascript, node.js
Solution
As suggested by dandavis in his comment, `readFile` does nothing because it is an asynchronous call. Check out this answer for additional information on what that means.
In short, an async call will never wait for the result to return. In your example, `getData` does not wait for `readFile()` to return the result you want, but will finish right away. Async calls are usually handled by passing `callbacks`, which is the last parameter to `readFile` and `writeFile`.
In any case, there are two ways to do this:
1.Do it asynchronously (which is the proper way):
function copyData(savPath, srcPath) {
fs.readFile(srcPath, 'utf8', function (err, data) {
if (err) throw err;
//Do your processing, MD5, send a satellite to the moon, etc.
fs.writeFile (savPath, data, function(err) {
if (err) throw err;
console.log('complete');
});
});
}
2.Do it synchronously. Your code won't have to change much, you will just need to replace `readFile` and `writeFile` by `readFileSync` and `writeFileSync` respectively. Warning: using this method is not only against best practises, but defies the very purpose of using nodejs (unless of course you have a very legitimate reason).
Edit: As per OP's request, here is one possible way to separate the two methods, e.g., using callbacks:
function getFileContent(srcPath, callback) {
fs.readFile(srcPath, 'utf8', function (err, data) {
if (err) throw err;
callback(data);
}
);
}
function copyFileContent(savPath, srcPath) {
getFileContent(srcPath, function(data) {
fs.writeFile (savPath, data, function(err) {
if (err) throw err;
console.log('complete');
});
});
}
This way, you are separating the read part (in `getFileContent`) from the copy part.
Problem
What I want to do is read a file and then be able to perform other operations with that information as I write the file. For example: read file write file and at the same time perform MD5 hash, digital signing etc. I could use fs.readfile and fs.writefile as one operation and just copy the file from the web server to my computer, but I don't think I could still do these same operations. Anyway, skipping the in between stuff. How do I use fs.readfile and writefile to create two separate functions to copy a file? Here is what I have been working on, and yes I've read these forums extensively in search of an answer. ``` var fs = require('fs'); function getData(srcPath) { fs.readFile(srcPath, 'utf8', function (err, data) { if (err) throw err; return data; } ); } function writeData(savPath, srcPath) { fs.writeFile (savPath, (getData(srcPath)), function(err) { if (err) throw err; console.log('complete'); } ); } //getData ('./test/test.txt'); writeData ('./test/test1.txt','./test/test.txt'); ``` I want to be able to download files of any type and just make raw copies, with md5 hash etc attached to a JSON file. That will probably be a question for later though.