2016-11-16 7 views
0

Я создаю свое первое приложение Node.js MVC (собственный узел, а не экспресс) и не удается отобразить изображения из моих html-файлов по их пути.Отображение изображений по относительной траектории в Node.js

Я избавлю вас мой server.js и router.js код, но вот мой контроллер код, который в основном, как Im загрузки мои взгляды:

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); 

это переходит в руки ...

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() 

Наконец, вот мой HTML с тегом и относительный путь в атрибуте SRC:

<div class="help"> 

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

</div> 

Мой фи le, поскольку она относится к приведенному выше, выглядит следующим образом:

Я уверен, что относительный путь правильный, но пробовал все комбинации относительного пути и даже абсолютного пути. Тем не менее изображение не отображается.

Исходя из фона LAMP, доступ к изображениям в дереве файлов является тривиальным, но я понимаю, что сервер настроен по-другому здесь (так как я был тем, кто его настроил).

Я получаю доступ к другим файлам (например, таблицам стилей) в файловой системе, создавая отдельный контроллер для загрузки этих файлов в явном виде и доступа к этому контроллеру с использованием URI. Но этот подход непрактичен для неопределенного количества изображений.

Как получить доступ к & Показать мои изображения в файловой системе с помощью Node.js?

+1

Вы понимаете, что node.js по умолчанию не поддерживает файлы NO, ничего из файловой системы. Таким образом, для каждого изображения, которое вы хотите использовать из файловой системы, вам необходимо убедиться, что он покрыт обработчиком маршрута для вашего HTTP-сервера. Для статических файлов и использования такой структуры, как Express, вы обычно используете 'express.static()', чтобы сказать express, чтобы искать любые файлы с определенным префиксом пути в определенной иерархии подкаталогов на вашем жестком диске. – jfriend00

+1

И, как правило, вы не хотите использовать относительные пути, потому что они относятся к URL-адресу страницы, на которой вы находитесь, что обычно усложняет вещи больше, чем упрощает. Как правило, вы должны использовать что-то вроде '/ public/img/test.jpg', и вы используете обработчик маршрута, который видит любой префикс '/ public', а затем ищет, что остальная часть пути в определенной иерархии подкаталогов. – jfriend00

+1

И многое из кода, который вы показываете в своем вопросе, может исчезнуть, если вы используете экспресс-поддержку и встроенную поддержку, с которой имеют рули. – jfriend00

ответ

2

Доступ к другим файлам (например, таблицам стилей) в файловой системе осуществляется путем создания отдельного контроллера для загрузки этих файлов в явном виде и доступа к этому контроллеру с использованием URI.

У вас должен быть контроллер. Так код преобразует URL-адрес, который браузер запрашивает в ответ.

Но этот подход непрактичен для неопределенного количества изображений.

Напишите общий вариант. Преобразуйте все URL-адреса, которые не соответствуют другому контроллеру, или которые начинаются с определенного пути, или заканчиваются .jpg, или любой другой логикой, которая вам нравится в пути к файлам на основе URL-адреса.

Прочитайте содержимое файла и выведите соответствующий HTTP-заголовок (включая правильный тип содержимого), за которым следуют данные.