2014-07-20 5 views
1

nodejs에 대한 소개를 위해 this tutorial을 따라 왔지만 response.write()를 사용하여 반환하는 데 문제가 있습니다.Response.write()가 값을 반환하지 않음

내 server.js 코드는 domain : 8001로 이동할 때 "hello world"를 반환하지만 도메인으로 이동하면 8001/socket.html이 빈 화면을 반환합니다.

console.log를 사용하여 "socket is here"라고 쓰는 코드를 확인했습니다. 실행되고 있지만, 왜 아무 것도하지 않는 이유를 모르겠습니다.

server.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; 
      console.log(__dirname); 
      console.log(path); 

    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("opps this doesn't exist - 404"); 
       } 
       else{ 
        response.writeHead(200, {"Content-Type": "text/html"}); 

        response.write("socket is here."); 
       } 
      }); 
      break; 
     default: 
      response.writeHead(404); 
      response.write("opps this doesn't exist - 404"); 
      break; 
    } 

    response.end(); 
}); 

server.listen(8001); 

var io = require('socket.io').listen(server); 

socket.html :

<html> 
    <head> 
    <script src="/socket.io/socket.io.js"></script> 
    </head> 
<body> 
    <script> 
     var socket = io.connect(); 
    </script> 
    <div>This is our socket.html file</div> 
</body> 
</html> 
+0

스크립트를로드하지 않으려 고 시도한 적이 있습니까? 스크립트가로드되는 동안 브라우저가 페이지 구문 분석을 중지하고 거기에 문제가 있으면 빈 페이지를 설명 할 수 있습니다. – Guffa

+0

스크립트없이 socket.html을 시도했지만 동일한 문제가있는 것 같습니다. – Rho

답변

1

당신은에 fs.readFile() 대기 전에 응답을 종료하고 (그 안에 포함 된 어떤 문제가되지해야하지만) 완전한. 이 시도 : 누군가가 /../../../../../../etc/passwd 같은 요청을 보낼 수 있기 때문에

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; 
      console.log(__dirname); 
      console.log(path); 

    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("opps this doesn't exist - 404"); 
       } 
       else{ 
        response.writeHead(200, {"Content-Type": "text/html"}); 

        response.write("socket is here."); 
       } 
       response.end(); 
      }); 
      return; 
     default: 
      response.writeHead(404); 
      response.write("opps this doesn't exist - 404"); 
      break; 
    } 

    response.end(); 
}); 

server.listen(8001); 

var io = require('socket.io').listen(server); 

또한, fs.readFile(__dirname + path, ...);을하는 것은 잠재적으로 위험하다. 대신에 path 모듈을 사용하여 __dirname + path을 절대 경로로 변환/정규화 한 다음 절대 경로가 공용 디렉토리의 절대 경로로 시작하는지 확인하십시오.

+0

정말 고마워요. 그것은 지금 위대한 작품. – Rho

관련 문제