ReadFile()和 readFileSync()之间的区别

下面的代码将 index.html 的内容(它只包含文本 hello world)输出到浏览器。但是,当我用 readFileSync()替换 readFile()时,请求会超时。

我遗漏了什么? 需要不同类型的缓冲区吗? 我使用的是节点0.61和 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);
});
169821 次浏览

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.

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

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.