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

时间:2014-04-04 12:43:09

标签: node.js callback readfile fs

我正试图在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?我可能会混淆不同的东西。
  3. 编辑:我试图像这样重构代码:

    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(数据)之前,我该如何发出信号?

2 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分: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();
        }
    });
}