readFile和readFileSync之间的区别

Ali*_*Ali 42 javascript node.js express

以下代码将index.html的内容(它只包含文本hello world)输出到浏览器.但是,当我用readFileSync替换readFile时,请求超时.我错过了什么?是否需要不同类型的缓冲区?我使用节点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);
});
Run Code Online (Sandbox Code Playgroud)

bry*_*mac 54

fs.readFile接受一个回调函数,调用response.send,如你所示 - 好.如果你只是用fs.readFileSync替换它,你需要知道它不需要回调,所以你的回调调用response.send将永远不会被调用,因此响应将永远不会结束,它将会超时.

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

此外,只是让你知道,你应该永远不会调用readFileSync中的一个节点快递/ Web服务器,因为在执行I/O会占用单线程循环.您希望节点循环处理其他请求,直到I/O完成并且您的回调处理代码可以运行.

  • 可以在服务器启动时调用readFileSync从磁盘加载SSL证书,因为您需要阻止它们直到准备就绪.但是,你更大的观点是完全正确的. (27认同)
  • 惯例是所有API都是异步的,异常使用格式xxxSync.避免使用xxxSync,除非您有意识地同步(启动或脚本).服务器应该是异步的. (4认同)

小智 19

'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");
Run Code Online (Sandbox Code Playgroud)

为了更好地理解运行上面的代码并比较结果..


小智 15

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

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

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

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

var data = fs.readFileSync(filename);
Run Code Online (Sandbox Code Playgroud)

大声笑...如果你不想要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();
Run Code Online (Sandbox Code Playgroud)

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