readFile() 和 readFileSync() 的区别

IT技术 javascript node.js express
2021-03-18 01:02:30

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

我错过了什么?是否需要不同类型的缓冲区?我正在使用节点 0.61 并表达 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);
});
3个回答

fs.readFile接受一个回调,该回调调用 response.send,如您所示 - 很好。如果你简单地用fs.readFileSync替换它,你需要注意它不接受回调,所以你调用 response.send 的回调永远不会被调用,因此响应永远不会结束,它会超时。

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

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

可以在服务器启动时调用 readFileSync 从磁盘加载 SSL 证书,因为您需要阻塞直到它们准备就绪。但是,你大一点是完全正确的。
2021-04-29 01:02:30
@bryanmac 谢谢,我在哪里可以了解有关在节点/express 应用程序中使用或不使用哪些功能的更多信息?
2021-04-30 01:02:30
约定是所有 API 都是异步的,并且例外使用格式 xxxSync。避免使用 xxxSync,除非您有意要同步(启动或脚本)。服务器应该是异步的。
2021-05-03 01:02:30
'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()是异步的,并在它们在后台运行时立即返回。您传递一个回调函数,该函数在完成时被调用。让我们举一个非阻塞的例子。

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

var fs = require('fs');
fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        console.log(data);
});

以下是以阻塞或同步方式读取文件。

var data = fs.readFileSync(filename);

大声笑...如果你不想要readFileSync()阻塞方式,那么请参考以下代码。(本国的)

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();

这意味着幕后readFileSync()工作与上述(Promise)基础相同。