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

我试图让我的头在Node.js同步与asynchronous,尤其是阅读一个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是asynchronous的,所以理论上我应该等待整个文件在呈现之前被读取,所以我应该引入一个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(); }); } 

这个变种更好,因为你不知道文件是否存在。 如果您确定可以读取文件的内容,则应该发送正确的标题。 另外,如果您的代码分支没有以“.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(); } }); }