当前位置: 首页 > 面试题库 >

从fs.readFileSync()到fs.readFile()的Node.js

文志学
2023-03-14
问题内容

我正在努力使自己在Node.js中实现同步与异步,尤其是在读取html文件时。

在请求处理程序中,可以使用的同步版本如下:

var fs = require("fs");
var filename = "./index.html";
var buf = fs.readFileSync(filename, "utf8");

function start(resp) {
    resp.writeHead(200, {"Content-type":"text/html"});
    resp.write(buf);
    resp.end();
    }

exports.start=start;
  1. 使用readFile()的版本是什么?
  2. 我了解readFile是异步的,因此从理论上讲,我应该等待整个文件读取后再呈现,因此我应该引入addListener吗?我可能会混淆其他事情。

编辑:我试图重构这样的代码:

var fs = require("fs");
var filename = "./index.html";
function start (resp) {
    resp.writeHead(200, {"Content-Type":"text/html"});
    fs.readFile(filename, "utf8", function (err, data) {
        if (err) throw err;
        resp.write(data);
        });
    resp.end();
    }

我得到一个空白页,我想这是因为它应该等待所有数据已被读取,然后再resp.write(data),我该如何发信号呢?


问题答案:
var fs = require("fs");
var filename = "./index.html";

function start(resp) {
    resp.writeHead(200, {
        "Content-Type": "text/html"
    });
    fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        resp.write(data);
        resp.end();
    });
}


 类似资料:
  • 问题内容: 日志,为什么? 问题答案: 为了详细说明@Raynos所说的内容,您定义的函数是一个异步回调。它不会立即执行,而是在文件加载完成后执行。当您调用readFile时,将立即返回控件并执行下一行代码。因此,当您调用console.log时,尚未调用您的回调,并且尚未设置此内容。欢迎使用异步编程。 示例方法 或者更好的是,如Raynos的示例所示,将您的调用包装在一个函数中并传递您自己的回调

  • 问题内容: 我知道在节点中进行开发时,应始终尝试避免阻塞(同步)功能并使用异步功能,但是我进行了一些测试,以了解它们之间的比较。 我需要打开一个包含i18n数据(例如日期和时间格式等)的json文件,并将该数据传递给使用该数据 在我的视图中格式化数字等的类。 开始将所有类的方法包装在回调中会很尴尬,因此,如果可能的话,我将改用同步版本。 This results in the following

  • 问题内容: 我尝试使用具有96GB RAM的服务器上的 fs.readFileSync 将大文件( 〜6Gb )加载到内存中。 问题是它失败并显示以下错误消息 RangeError:尝试分配大于最大大小的缓冲区:0x3fffffff字节 不幸的是,我没有发现增加Buffer的可能性,这似乎是一个常数。 如何克服此问题并使用Node.js加载大文件? 谢谢! 问题答案: 来自一个快乐的常见问题解答:

  • 我想Node.js读取form.html当域名localhost:3000/form,但由于某种原因,它总是给我一个错误500页。 fs.readFile的回调函数中的content参数未定义,即使文件的路径正确。 添加了错误消息: {[Error:enoint,打开'C:\form.html']errno:34,代码:'enoint',路径:'C:\form.html'} 我必须指定文件的完整路

  • 我打印了错误, 这两个文件在同一个目录中

  • 问题内容: 我正在弄乱node.js,发现了两种读取文件并通过有线方式发送文件的方法,一旦我确定它存在并使用writeHead发送正确的MIME类型: 如果所讨论的文件很大,例如视频,fs.createReadStream可能会提供更好的用户体验,我是否正确?感觉好像不那么块状。这是真的?我还需要了解其他优点,缺点,警告或陷阱吗? 问题答案: 如果您只是将“数据”连接到“ write()”,将“关