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

Bon*_*nch 43 callback fs readfile node.js

我试图在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; 
Run Code Online (Sandbox Code Playgroud)
  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();
    }
Run Code Online (Sandbox Code Playgroud)

我得到一个空白页面,我想这是因为它应该等待所有数据都被读取,在resp.write(数据)之前,我该如何发出信号?

web*_*vet 42

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

  • 如果你没有在回调中提供它,你的`resp.end()`将立即被调用,因为它不等待来自回调的响应. (8认同)
  • 谢谢,它确实有效.跟进问题,你可能已经看过我的编辑,在我的试探性答案中我没有在回调中包含resp.end(),这不起作用,你知道为什么它必须在回调中吗?RGDS (2认同)

Ach*_*ian 8

此变体更好,因为您无法知道文件是否存在.如果您确定可以阅读文件内容,则应发送正确的标题.此外,如果您的代码分支没有以'.end()'结尾,浏览器将等到它们获得它们.换句话说,您的浏览器将等待很长时间.

var fs = require("fs");
var filename = "./index.html";

function start(resp) {

    fs.readFile(filename, "utf8", function(err, data) {
        if (err) {
            // may be filename does not exists?
            resp.writeHead(404, {
                'Content-Type' : 'text/html'
            });
            // log this error into browser
            resp.write(err.toString());
            resp.end();
        } else {

            resp.writeHead(200, {
                "Content-Type": "text/html"
            });      
            resp.write(data.toString());
            resp.end();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)