Difference between readFile() and readFileSync()
Solution 1
fs.readFile takes a call back which calls response.send as you have shown - good. If you simply replace that with fs.readFileSync, you need to be aware it does not take a callback so your callback which calls response.send will never get called and therefore the response will never end and it will timeout.
You need to show your readFileSync code if you're not simply replacing readFile with readFileSync.
Also, just so you're aware, you should never call readFileSync in a node express/webserver since it will tie up the single thread loop while I/O is performed. You want the node loop to process other requests until the I/O completes and your callback handling code can run.
Solution 2
'use strict'
var fs = require("fs");
/***
* implementation of readFileSync
*/
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");
/***
* implementation of readFile
*/
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("Program Ended");
For better understanding run the above code and compare the results..
Solution 3
readFileSync()
is synchronous and blocks execution until finished. These return their results as return values.
readFile()
are asynchronous and return immediately while they function in the background. You pass a callback function which gets called when they finish.
let's take an example for non-blocking.
following method read a file as a non-blocking way
var fs = require('fs');
fs.readFile(filename, "utf8", function(err, data) {
if (err) throw err;
console.log(data);
});
following is read a file as blocking or synchronous way.
var data = fs.readFileSync(filename);
LOL...If you don't want
readFileSync()
as blocking way then take reference from the following code. (Native)
var fs = require('fs');
function readFileAsSync(){
new Promise((resolve, reject)=>{
fs.readFile(filename, "utf8", function(err, data) {
if (err) throw err;
resolve(data);
});
});
}
async function callRead(){
let data = await readFileAsSync();
console.log(data);
}
callRead();
it's mean behind scenes
readFileSync()
work same as above(promise) base.
Related videos on Youtube
Ali
Updated on July 30, 2020Comments
-
Ali over 3 years
The following code outputs the content of the index.html (it just contains the text hello world) to the browser. However, when I replace
readFile()
withreadFileSync()
, the request times out.What am I missing? Is a different kind of buffer required? I am using node 0.61 and express 2.4.
var express = require('express'); var fs = require('fs'); var app = express.createServer(express.logger()); app.get('/', function(request, response) { fs.readFile('index.html', function(err, data){ response.send(data.toString()); }); }); var port = process.env.PORT || 5000; app.listen(port, function() { console.log("Listening on " + port); });
-
Admin over 10 yearsAren't you supposed to call
.end()
when you're done sending? It's been a while since I used NodeJS. -
freakish over 10 yearsWhat do you mean by
when I replace readFile with readFileSync
? The first one requires a callback while the other one does not. The code should bevar data = fs.readFileSync('index.html');
. The callback is never called, becausereadFileSync
does not use it. That's where the timeout comes from. Assuming I understand it correctly. -
freakish over 10 years@CrazyTrain He's using Express. It does it for you.
-
Admin over 10 years@freakish: Thanks. I never did use Express.
-
Ali over 10 years@freakish Thanks, can you recommend reading materials to understand node and callbacks better?
-
-
Dan Kohn over 10 yearsIt's fine to call readFileSync to load your SSL certificates from disk as the server starts, as you need to block until those are ready. But, you're larger point is completely correct.
-
Ali over 10 years@bryanmac thanks, Where can I learn more about which functions to use or not in a node/express app?
-
bryanmac over 10 yearsThe convention is all APIs are async and the exceptions use the format xxxSync. Avoid the xxxSync unless you are consciously meaning to be synchronous (startup or a script). A server should be async.
-
bryanmac over 10 yearsanother resource: blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop