简单的node.js服务器没有error handling失败的请求

我用下面的代码build立了一个简单的node.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 '/socket.html': fs.readFile(__dirname + path, function(error, data){ console.log(path); console.log(error); if (error){ response.writeHead(404); response.write("opps this doesn't exist - 404"); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); } }); break; default: response.writeHead(404); response.write("opps this doesn't exist - 404"); break; } response.end(); }); server.listen(8001); 

连接到本地主机:8001按预期工作。

但是,当我尝试连接到本地主机:8001 / socket.html,服务器崩溃,并显示以下错误terminal:

events.js:141扔呃; //未处理“错误”事件^

错误:在FSReqWrap.readFileAfterClose处的/Users/Nikos/Desktop/hack_reactor/server.js:24:34处的ServerResponse.OutgoingMessage.write(_http_outgoing.js:428:15)处结束写入[ascomplete](fs.js: 380:3)

在debugging时,console.log(error)返回null。 请解释为什么发生这种情况。

你的代码中的问题是fs.readFile是asynchronous函数,因此在response.write之前运行response.end。 在响应之后,连接closures,你不能再写了。 解决scheme很简单。 写完后,只需调用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 '/socket.html': fs.readFile(__dirname + path, function(error, data){ console.log(path); console.log(error); if (error){ response.writeHead(404); response.write("opps this doesn't exist - 404"); response.end(); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); response.end(); } }); break; default: response.writeHead(404); response.write("opps this doesn't exist - 404"); response.end(); break; } }); server.listen(8001); 

来自Async的问题com。 readFile你在fs.readFile结束之前发送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'); break; case '/socket.html': fs.readFile(__dirname + path, function(error, data){//<-----------+ console.log(path);// | console.log(error);// | if (error){// | response.writeHead(404);// | response.write("opps this doesn't exist - 404");// | }// | else{// | response.writeHead(200, {"Content-Type": "text/html"});// | response.write(data, "utf8");// | }// | });// | break;// | default:// | response.writeHead(404);// | response.write("opps this doesn't exist - 404");// | break;// | }// | response.end();//<--------------------------This Happen before the end of |--^ | fs.readFile }); server.listen(8001); 

像这样尝试

 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 '/socket.html': fs.readFile(__dirname + path, function(error, data){ console.log(path); console.log(error); if (error){ response.writeHead(404); response.write("opps this doesn't exist - 404"); response.end(); } else{ response.writeHead(200, {"Content-Type": "text/html"}); response.write(data, "utf8"); response.end(); } }); break; default: response.writeHead(404); response.write("opps this doesn't exist - 404"); response.end(); break; } }); server.listen(8001);