2015-10-17 83 views
1

我已經建立了一個簡單的node.js服務器用下面的代碼:簡單的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,服務器崩潰並顯示到終端以下錯誤:

events.js:141 throw er; // Unhandled 'error' event ^

Error: write after end at ServerResponse.OutgoingMessage.write (_http_outgoing.js:428:15) at /Users/Nikos/Desktop/hack_reactor/server.js:24:34 at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3)

調試時的console.log(誤差)返回null 。請解釋爲什麼發生這種情況。

回答

3

在你的代碼的問題是,fs.readFile是異步函數,因此是到Response.End在response.write之前運行。在響應之後,連接關閉,你不能再寫了。解決方案很簡單。完成寫作後,只需致電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); 
+0

非常感謝。 –

-1

來自異步的問題com。的readFile 您的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); 

月底前向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); 
相關問題