刚看了一点马丁的《代码整洁之道》,于是心血来潮想把这几天做的Node联系进行一番代码重构,心里默念,高内聚低耦合,函数简洁明了,etc…
于是,在这段要读取本地文件内容的代码中,我将createServer后的回调printFile以及readFile后的回调getData都准备抽出来,并打算通过赋值的方式获取fileData,并最终将fileData打印到页面,代码如下:
//print_local_file.js
var http = require("http");
var fs = require("fs");
var fileData = "";
function getData(err, data) {
if (err) {
throw err;
}
// 操作data
fileData = data;
console.log(fileData);
}
function printFile(req, res) {
console.log("server started");
fs.readFile("text.txt", getData);
res.writeHead(200, {
"Content-Type": "text/plain"
});
res.write(fileData);
res.end()
}
http.createServer(printFile).listen(8888);
结果,getData中的console.log(fileData)还没执行完就直接报错:
这让人反思:
getData还没有执行就去执行了res.write
看来不能这样写,目前是没有办法把函数抽出来了,只能乖乖的用异步了:
function printFile(req, res) {
console.log("server started");
fs.readFile("text.txt", function(err,data){
res.writeHead(200, {
"Content-Type": "text/plain"
});
res.write(fileData.toString());
res.end()
});
}
据说,Node.js提供了一种机制可以进行异步控制,叫做promise,稍后会去学!
ps:fs.readFileSync是fs.readFile的同步版本,读取到的文件内容会以函数返回值的形式返回。
所以,可以这样写:
function printFile(req, res) {
console.log("server started");
var fileData = fs.readFileSync("text.txt", "utf-8");
res.writeHead(200, {
"Content-Type": "text/plain"
});
res.write(fileData);
res.end()
}
http.createServer(printFile).listen(8888);