我用以下代码设置了一个简单的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);
连接到localhost:8001可以正常工作。
但是,当我尝试连接到localhost:8001 / socket.html时,服务器崩溃,终端显示以下错误:
events.js:141 throw er; //未处理的“错误”事件^
错误:写在FSReqWrap.readFileAfterClose处/Users/Nikos/Desktop/hack_reactor/server.js:24:34处的ServerResponse.OutgoingMessage.write(_http_outgoing.js:428:15)结束时[不完整](fs.js: 380:3)
调试时,console.log(error)返回null。请解释为什么会这样。
您的代码中的问题是fs.readFile是异步函数,因此response.end在response.write之前运行。在response.end之后,连接被关闭,您不能再写了。解决方案很简单。完成编写后,只需调用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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句