2015-04-14 3 views
0

Я новичок в node.js и нашел простой учебник по настройке простого сервера node.js. Я пытаюсь отобразить html-страницу на стороне клиента, я получаю файл, который я вижу на консоли, но браузер показывает пустую страницу? Это мой server.js файл:Node.js возвращает пустой HTML-файл клиенту

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){     
      if (error){              
       response.writeHead(404); 
       response.write("Oops, this doesn't exist! - 404");   
      } 
      else {               
       response.writeHead(200, {"Content-Type": "text/html"});  
       response.write(data, "utf8"); 
       console.log('Connection working!'); 
      } 
     }); 
     break; 
    default: 
     response.writeHead(404); 
     response.write("Oops, this doesn't exist - 404");     
     break; 
} 
    response.end();                
}); 

server.listen(8001); 

Вот мой простой HTML-файл socket.html

<!DOCTYPE html> 
<html> 
    <head></head> 
    <body> 
     <div> 
      <h1>This is the socket.html file</h1> 
     </div> 
    </body> 
</html> 

И мой ответ в браузере:

Browser response

Я дважды проверил, что я правильно использую модули «url» и «fs», которые, как мне кажется, я делаю? Может ли кто-нибудь помочь?

ответ

1

fs.readfile является асинхронным и возвращает содержимое файла после того, как вы вызвали response.end().

Это быстрое решение. Надеюсь, что это работает. Я переместил 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'); 
      response.end(); 
      break; 
     case '/socket.html': 
      fs.readFile(__dirname + path, function(error, data){ 
       if (error){ 
        response.writeHead(404); 
        response.write("Oops, this doesn't exist! - 404"); 
       } 
       else { 
        response.writeHead(200, {"Content-Type": "text/html"}); 
        response.write(data, "utf8"); 
        console.log('Connection working!'); 
       } 
       response.end(); 
      }); 
      break; 
     default: 
      response.writeHead(404); 
      response.write("Oops, this doesn't exist - 404"); 
      response.end(); 
      break; 
    } 
}); 

server.listen(8001); 
+0

Перемещение'response.end() дать мне эту ошибку в console.log: 'GET HTTP: // локальный: 8001/socket.html сетка :: ERR_CONNECTION_REFUSED' –

+0

Это не должно быть вызвано этим , Вы говорите, что получаете это в консоли сервера? – MiniGod

+0

Я переместил 'response.end()' в значение по умолчанию, и теперь он работает! Но логически я не понимаю, почему именно. Если я первый «случай» верен, мне еще не нужен «response.end()»? –