2016-11-16 2 views
0

첫 번째 Node.js MVC 앱 (Express는 사용하지 않는 기본 노드)을 빌드하고 상대 경로를 통해 HTML 파일의 이미지를 표시하는 데 문제가 있습니다.Node.js의 상대 경로로 이미지 표시

내가 여기 당신이 내 server.js 및 router.js 코드를 아끼지 만 것이다는 기본적으로 방법 임 로딩 내보기 내 컨트롤러 코드 :이이 전달됩니다

var fs = require("fs"); 
var controller = require("controller"); 

var load_view = 'view_home'; 
var context = { foo : 'bar' }; 

controller.load_view(res, req, fs, load_view, context); 

에 ...

<div class="help"> 

    <img src="../public/img/test.jpg" /> 

</div> 

내 Fi를 마지막으로

var url   = require('url'); 
var Handlebars = require('handlebars'); 

function load_view(res, req, fs, view, context, session){ 

    // Files to be loaded, in order 
    var files = [ 
     'view/elements/head.html', 
     'view/elements/header.html', 
     'view/' + view +'.html', 
     'view/elements/footer.html' 
    ];  

    // Start read requests, each with a callback that has an extra 
    // argument bound to it so it will be unshifted onto the callback's 
    // parameter list 
    for(var i=0; i<files.length; ++i) 
     fs.readFile(files[i], handler.bind(null, i)); 

    var count = 0; 

    function handler(index, err, content) { 

     // Make sure we don't send more than one response on error 
     if(count < 0) return; 
     if(err) { 
      count = -1; 
      console.log('Error for file: ' + files[index]); 
      console.log(err); 
      res.writeHead(500); 
      return res.end(); 
     } 

     // Reuse our `files` array by simply replacing filenames with 
     // their respective content 
     files[index] = content; 


     // Check if we've read all the files and write them in order if 
     // we are finished 
     if(++count===files.length) { 
      res.writeHead(200, { 'Content-Type': 'text/html' }); 
      for(var i = 0; i < files.length; ++i) { 

       var source = files[i].toString('utf8'); 

       // Handlebars 
       var template = Handlebars.compile(source); 
       var html = template(context); 

       res.write(html); /* WRITE THE VIEW (FINALLY) */ 

      } 
      res.end(); 
     } 

    } // handler() 

} // load() 

, 여기에 src 속성 태그와 상대 경로 내 HTML입니다 le 시스템은 다음과 같습니다 :

상대 경로는 정확하지만 상대 경로와 절대 경로의 모든 조합을 시도했습니다. 그래도 이미지가 표시되지 않습니다.

램프 배경에서 오는 파일 트리에서 이미지에 액세스하는 것은 쉽지 않지만 서버가 많이 다르게 설정되었음을 알았습니다 (설정 한 이래로).

파일 시스템의 다른 파일 (예 : 스타일 시트)에 액세스하려면 별도의 컨트롤러를 만들어 파일을 명시 적으로로드하고 URI를 사용하여 해당 컨트롤러에 액세스하십시오. 그러나 불확실한 수의 이미지에 대해서는이 방법이 비실용적입니다.

&에 액세스하려면 어떻게해야합니까? Node.js가있는 파일 시스템에 이미지를 표시하려면 어떻게해야합니까?

+1

node.js는 기본적으로 NO 파일을 제공하며 파일 시스템은 제공하지 않는다는 점을 이해하고 계십니까? 따라서 파일 시스템에서 제공하려는 모든 이미지에 대해 해당 이미지가 http 서버의 경로 처리기에서 처리되는지 확인해야합니다. 정적 파일과 Express와 같은 프레임 워크를 사용하는 경우 일반적으로'express.static()'를 사용하여 하드 드라이브의 특정 하위 디렉토리 계층에 특정 경로 접두사가있는 파일을 찾습니다. – jfriend00

+1

그리고 상대 경로는 일반적으로 사물을 단순화하는 것보다 복잡한 작업을하는 페이지의 URL과 관련이 있기 때문에 일반적으로 사용하지 않을 것입니다. 더 일반적으로, 당신은'/ public/img/test '와 같은 것을 사용할 것입니다.jpg'를 사용하고'/ public'의 접두어를 보는 경로 처리기를 사용하고 특정 하위 디렉토리 계층 구조에서 나머지 경로를 찾습니다. – jfriend00

+1

그리고 익스프레스를 사용하고 핸들 바가 가지고있는 내장 지원 기능을 사용하면 질문에 표시되는 많은 코드가 사라질 수 있습니다. – jfriend00

답변

2

는 I 명시 그 파일을로드하고, 그 URI를 이용하여 컨트롤러에 액세스하기 위해 별도의 컨트롤러를 작성하여 파일 시스템의 (스타일 시트 등)를 다른 파일에 액세스.

컨트롤러가 있어야합니다. 이것이 코드가 브라우저가 요청한 URL을 응답으로 변환하는 방법입니다.

그러나이 방법은 불확실한 수의 이미지에 대해서는 비실용적입니다.

일반적인 것을 작성하십시오. 다른 컨트롤러와 일치하지 않거나 특정 경로로 시작하거나 .jpg으로 끝나는 URL을 변환하거나 URL을 기반으로 파일 경로를 원하는 논리로 변환하십시오.

파일의 내용을 읽고 적합한 HTTP 헤더 (올바른 내용 유형 포함)와 데이터를 출력합니다.

관련 문제