带有fs.readFile的Node.js无法通过http呈现文件内容

我正在学习node.js,但是在我简单的web服务器代码(demo.js下面)中,我正在努力使用fs.readFile函数。 如果我访问http://localhost:8001/demo.html我在浏览器中没有得到任何数据,但是如果我访问“/”或任何其他文件名,我会看到“hello world”或404页。

我已经包含了demo.html的内容和节点控制台输出,其中日志消息表明readFile正在读取文件OK,但是在浏览器中我什么也没有看到,并且没有看到'Got here D'日志消息。

我相信我一定会错过一些明显的东西,但是看不到。 任何帮助,将不胜感激!

demo.js代码:

 var http = require("http"); var url = require('url'); var fs = require('fs'); var server = http.createServer(function(request, response){ console.log('Connection'); var path = url.parse(request.url).pathname; switch(path){ case '/': response.writeHead(200, {'Content-Type': 'text/html'}); response.write('hello world'); break; case '/demo.html': fs.readFile(__dirname + path, function(error,data){ console.log("error: " + error); console.log("data: " + data); if (error){ console.log("Got here A"); response.writeHead(404); response.write("oops problem loading this page - 404"); } else{ console.log("Got here B"); response.writeHead(200, {"Content-Type": "text/html"}); response.write(data); } }); break; default: console.log("Got here C"); response.writeHead(404); response.write("oops this page doesn't exist - 404"); break; } response.end(); console.log("Got here D"); }); server.listen(8001); 

demo.html:

 <html> <body>This is my demo page</body> </html> 

节点控制台输出:

 C:\code\Node>node demo.js Connection Got here D error: null data: <html> <body>This is my demo page</body> </html> Got here B 

问题在于response.end()调用的位置。

fs.readFile是一个asynchronous函数 ; 像与I / O相关的节点中的所有function一样。 这意味着文件的读取是在后台进程中完成的,当数据可用时,您定义的callback函数将被调用并返回结果。

节点继续在fs.readFile之后执行你的代码,这会导致response.end()在你的callback函数build立响应之前被调用。

为了解决这个问题,你必须将response.end()调用移动到如下所示的例子中:

 var http = require("http"); var url = require('url'); var fs = require('fs'); var server = http.createServer(function(request, response){ console.log('Connection'); var path = url.parse(request.url).pathname; switch(path){ case '/': response.writeHead(200, {'Content-Type': 'text/html'}); response.write('hello world'); response.end(); break; case '/demo.html': fs.readFile(__dirname + path, function(error,data){ console.log("error: " + error); console.log("data: " + data); if (error){ response.writeHead(404); response.write("oops problem loading this page - 404"); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data); } response.end(); }); break; default: response.writeHead(404); response.write("oops this page doesn't exist - 404"); response.end(); break; } });