我正试图在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;
编辑:我试图像这样重构代码:
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(数据)之前,我该如何发出信号?
答案 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();
}
});
}