[英]simple node.js server not error handling failed request
我用以下代碼設置了一個簡單的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);
來自異步的問題com。 的READFILE您發送response.end()
結束前fs.readFile
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.