2013-08-01 3 views
0

그래서 node.js를 배우므로 성공적으로 새 HTML 페이지로 라우팅하고 기본 텍스트를 표시 할 수 있습니다. 그러나 다른 자바 스크립트, CSS 또는 이미지를 추가하려고하면 전체 HTML 파일을로드하는 것처럼 appearently 처리합니다.Node.js가 페이지를로드하는 방법 이해

코드는 정말 그렇게 내 CONSOLE.LOG 출력을 공유 할 게시물에 너무 오래 될 것이다 :/접수 시작

  • 요청.
  • /start에 대한 요청을 라우팅하려고합니다.
  • 요청 처리기 "start"가 호출되었습니다.
  • /socket.io/lib/socket.io.js 요청이 접수되었습니다. 이 항공사는 약
  • 는 /socket.io/lib/socket.io.js에 대한 요청은
  • 없음 요청 처리기는 /socket.io/lib/socket.io.js을 찾을 수 없습니다 /style.css에 대한
  • 요청 받았습니다. /test.jpg 수신의 노선에 대해
  • /style.css
  • 없음 요청 처리기에 대한 요청은 /style.css
  • 요청을 발견했다. /favicon.ico 수신의 노선에 대해
  • /test.jpg
  • 없음 요청 처리기에 대한 요청은 /test.jpg
  • 요청을 발견했다. 이 항공사는 약
  • 는 /favicon.ico
  • 에 대한 요청 없음 요청 처리기는 내가 전체 favicon.ico 혼란을 이해 /favicon.ico

을 찾을 수 없습니다하지만 난 다른 파일을 처리하는 이유를 잘 모릅니다 그건 그렇고.

Node.js로 페이지를로드 할 때 수행 할 작업/고려해야 할 사항은 무엇입니까?

+1

귀하의 질문은 Node.js에 전혀 영향을 미치지 않으며 Node.js 위에 HTTP 요청을 처리하기 위해 사용하는 모든 프레임 워크와 관련이 있기 때문에 완전히 대답 할 수 없습니다. 뭐라구? 표하다? 당신의 코드? 그 질문이 무엇 인지도 분명하지 않습니다. – Brad

+0

지금은 익스프레스를 사용하지 않습니다. 더 자세히 보았을 때 이것이 나의 이론입니다 :'fs.readFile'을 읽고 index.html을 읽을 때, 그것은 통과하여 제 CSS 또는 JS 파일에 대한 링크를 알려줍니다. 그런 다음 그것들을 읽고'Content-Type :'이'text/html'로 설정되어 있기 때문에 제대로 읽지 않습니다. 따라서 그것을 표시하지 않습니다. 'text/css' 또는 뭔가 있어야합니다. – JDillon522

+1

[SSCCE] (http://sscce.org) – Zeta

답변

2

node.js는 기본적으로 webroot 디렉토리에있는 파일을 제공하는 웹 서버가 아닙니다. 네트워크 및 http 요청을 처리하는 API가있는 저수준 응용 프로그램입니다. express.js는 리소스를 저장할 수있는 공용 폴더를 노출하지만, 파일과 리소스를 가져 오며 언급 한 것과 거의 같은 방법을 사용하여 요청에 응답합니다.

Node.js는 HTTP에서 서브 파일을 처리하도록 정확하게 최적화되지 않았습니다. 대부분의 사람들이 프로덕션에서 역방향 프록시 (nginx는 인기있는 선택)를 설치하므로 라우트 요청이 발생합니다. nginx가 웹 루트에서 파일을 찾으면 간단히 파일을 제공하도록 지시 할 수 있습니다. 그렇지 않으면 요청을 node.js로 리디렉션합니다.

+0

아참. 나는 배울 것이 많다. – JDillon522

+0

@ JDillon522 아무 문제 없지만 좋은 입력 주셔서 감사합니다. 그것은 그렇게 많이 배우는 것이 아닙니다. nginx를 노드의 역방향 프록시로 설정하는 것은 요즘의 표준 설정과 비슷하므로 Google 검색을 통해 여러 가지 유용한 결과가 표시됩니다. 그 외에도 노드가 저수준 응용 프로그램임을 기억하면됩니다. 예를 들어, 레일에 루비보다 배우고 기억해야 할 것들이 더 적다고 말할 수 있습니다. – Munim

0

글쎄요, 저보다는 아직 익숙하지 않은 사람들을 위해 없이 Express를 사용하여을 표시하는 방법이 있습니다.

var file_path = ""; 
    var mimes = { 
     'css': 'text/css', 
     'js': 'text/javascript', 
     'htm': 'text/html', 
     'html': 'text/html', 
     'png': 'image/png', 
     'jpg': 'image/jpg', 
     'jpeg': 'image/jpeg' 
    }; 

    // parses the url request for a file and pulls the pathname 
    var url_request = url.parse(request.url).pathname;  
    // finds the placement of '.' to determine the extension     
    var tmp = url_request.lastIndexOf("."); 
    // determines the extension by uing .substring that takes everything after '.' 
    var extension = url_request.substring((tmp + 1)); 

    //set path of static pages 
    if (extension === 'css' || extension === 'js' || extension === 'htm' || extension === 'html' || extension === 'png' || extension === 'jpg' || extension === 'jpeg'){ 
     file_path = url_request.replace("/", ""); 
    } 

    //load needed pages and static files 
    fs.readFile(file_path, function (error, data){ 
     if(error){ 
      response.writeHeader(500, {"Content-Type": "text/html"}); 
      response.write("<h1>FS READ FILE ERROR: Internal Server Error!</h1>");  
     } 
     else{ 
      response.writeHeader(200, {"Content-Type": mimes[extension]}); 
      response.write(data); 
     } 

     response.end(); 
    }); 

Express를 사용하지 않고보다 간결한 방법을 알고 싶습니다.

관련 문제