以下代码将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);
});
答案 0 :(得分:47)
fs.readFile接听一个回调,调用如你所示的response.send - 好。如果您只是将其替换为fs.readFileSync,则需要注意它不需要回调,因此调用response.send的回调将永远不会被调用,因此响应永远不会结束并且会超时。
如果您不是简单地用readFileSync替换readFile,则需要显示readFileSync代码。
另外,您应该知道,您应该从不在node express / webserver中调用readFileSync,因为它会在执行I / O时占用单线程循环。您希望节点循环处理其他请求,直到I / O完成并且您的回调处理代码可以运行。
答案 1 :(得分:17)
'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");
为了更好地理解,请运行上面的代码并比较结果..
答案 2 :(得分:0)
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);
LOL ...如果您不希望
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()
的幕后工作与上述(承诺)基础相同。