Javascript readFile()和readFileSync()之间的区别

Javascript readFile()和readFileSync()之间的区别,javascript,node.js,express,Javascript,Node.js,Express,下面的代码将index.html的内容(它只包含文本hello world)输出到浏览器。但是,当我将readFile()替换为readFileSync()时,请求超时 我错过了什么?是否需要另一种缓冲区?我使用的是节点0.61和express 2.4 var express = require('express'); var fs = require('fs'); var app = express.createServer(express.logger()); app.get('/',

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

我错过了什么?是否需要另一种缓冲区?我使用的是节点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);
});
接受一个呼叫response.send的回拨,如您所示-很好。如果只是将其替换为,则需要注意它不接受回调,因此调用response.send的回调将永远不会被调用,因此响应将永远不会结束,并且将超时

如果不是简单地用readFileSync替换readFile,则需要显示readFileSync代码

另外,正如您所知道的,您应该永远不要在node express/webserver中调用readFileSync,因为它会在执行I/O时阻塞单线程循环。您希望节点循环处理其他请求,直到I/O完成并且回调处理代码可以运行为止

'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");
为了更好地理解,请运行上述代码并比较结果。

readFileSync()
是同步的,会阻止执行直到完成。它们将结果作为返回值返回。
readFile()
是异步的,在后台运行时会立即返回。您传递一个回调函数,该函数在它们完成时被调用。 让我们举一个非阻塞的例子

以下方法以非阻塞方式读取文件

以下是以分块或同步方式读取文件

LOL…若你们不想用
readFileSync()
作为阻塞方式,那个么就采取 参考以下代码。(本地人)

这意味着幕后
readFileSync()
的工作与上述(promise)基本相同


发送完毕后,您不应该调用
.end()
吗?我已经有一段时间没有使用NodeJS了。当我用readFileSync替换readFile时,
是什么意思?第一个需要回调,而另一个不需要回调。代码应该是
var data=fs.readFileSync('index.html')。永远不会调用回调,因为
readFileSync
不使用它。这就是超时的原因。假设我理解正确的话。@CrazyTrain他用的是Express。这是为你做的。@freakish:谢谢。我从来没有使用过Express。@非常感谢,您能推荐一些阅读材料来更好地理解节点和回调吗?在服务器启动时调用readFileSync从磁盘加载SSL证书是可以的,因为您需要阻止这些证书,直到它们准备好。但是,您的观点是完全正确的。@bryanmac谢谢,我从哪里可以了解更多关于在node/express应用程序中使用或不使用哪些函数的信息?惯例是所有API都是异步的,例外情况使用xxxSync格式。除非您有意要同步(启动或脚本),否则请避免使用xxxSync。服务器应该是异步的。其他资源:
var fs = require('fs');
fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        console.log(data);
});
var data = fs.readFileSync(filename);
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();