Difference between readFile() and readFileSync()

Javascriptnode.jsExpress

Javascript Problem Overview


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() with readFileSync(), 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);
});

Javascript Solutions


Solution 1 - Javascript

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 - Javascript

'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 - Javascript

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAliView Question on Stackoverflow
Solution 1 - JavascriptbryanmacView Answer on Stackoverflow
Solution 2 - JavascriptSaurabh ChauhanView Answer on Stackoverflow
Solution 3 - JavascriptParesh BaradView Answer on Stackoverflow