2014-02-20 3 views
3

Я установил конфигурационный файл для хранения настроек, таких как путь к программе, секрет cookie и т. П. Для моего экспресс-приложения. Проблема в том, что это, кажется, игнорирование моей настройки каталога пути просмотра.Экспресс, игнорирующий представление каталога

config.js:

... 
exports.server = { 
    port: 3000, 
    cookie_secret: ".....", 
    path: "/var/www/onmynode-dev/" 
} 
... 

app.js:

... 
app.set('views', path.join(config.server.path, 'views')); 
app.set('view engine', 'html'); 
app.engine('html', require('express3-handlebars')({defaultLayout: "default.html"})); 
... 

Маршрут устанавливается следующим образом:

app.get('/', routes.index); 

Вид вызывается из запроса следующим образом :

exports.index = function(req, res){ 
    res.render('index'); 
}; 

console.log объекта app (var app = express();) в самом конце моего файла app.js.

... 
settings: 
{ 'x-powered-by': true, 
etag: true, 
env: 'development', 
'subdomain offset': 2, 
view: [Function: View], 
views: '/var/www/onmynode-dev/views', 
'jsonp callback name': 'callback', 
'json spaces': 2, 
port: 3000, 
'view engine': 'html' 
}, 
... 

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

500 Error: ENOENT, open '/home/user/views/layouts/default.html' 

Так что, как представляется, использовать переменную __dirname независимо от того, как Я все наладил. Вопрос: как мне отладить/исправить эту проблему?

+0

Можете ли вы дать нам то, что вы называете при рендеринге ваш взгляд? – SomeShinyObject

+0

Спасибо, я добавил детали к вопросу. – onmylemon

+0

Стоит отметить, что если я подключился к каталогу перед запуском приложения, он отлично работает. Поэтому я думаю, что где-то __dirname вводится как путь к представлениям. – onmylemon

ответ

7

Выстрел в темноте, но я только что прочитал документы express3-handlebars.

Макеты

Компоновка просто шаблон Рули с {{{body}}} заполнителем. Обычно это будет оболочка HTML-страницы, в которой будут отображаться представления .

Этот механизм просмотра добавляет обратно концепцию «макета», которая была удалена в Express 3.x. Его можно настроить с помощью пути к каталогу , по умолчанию он установлен в «views/layouts /».

Есть два способа установить раскладку по умолчанию: настройка defaultLayout свойства двигателя вид или настройки Express местным жителям app.locals.layout.

Макет, в который нужно визуализировать представление, может быть переопределен для каждого запроса, назначив другое значение запросу макета .Далее будет оказывать «домашний» вид, без макета:

app.get('/', function (req, res, next) { 
    res.render('home', {layout: false}); }); 

Возможно, это относится к __dirname+'/views' и игнорирует то, что вы установили в конфигурации.

Попробуйте добавить {layout: false}, как указано выше. Если это сработает, то это ваша проблема.

Непрерывное чтение привело меня к выводу, что вы можете изменить расположение рулей на своих макетах. Вы можете добавить layoutsDir конфигурации, как вы делали с defaultLayout и установите его в том же каталоге, что и экспресс просмотров:

var hbConfig = { 
    layoutsDir: path.join(app.settings.views, "layouts"), 
    defaultLayout: "default.html" 
} 
app.engine('html', require('express3-handlebars')(hbConfig)); 
+0

Работает отлично, спасибо. – onmylemon

1

попробовать это:

app.set('view engine', 'html'); 
app.engine('html', require('express3-handlebars')({ 
    defaultLayout: path.join(config.server.path, "views/layouts/default.html"), 
    layoutsDir: path.join(config.server.path, "views/layouts"), 
    partialsDir: path.join(config.server.path, "views/partials") 
})); 
app.set('views', path.join(config.server.path, 'views')); 

Конечно, вы должны поставить default.html в каталоге views/layouts/.

Смежные вопросы