2014-02-20 59 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'); 
}; 

應用程序對象(var app = express();)的console.log在我的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財產,或設置快速當地人 app.locals.layout。

通過向佈局請求 local分配不同的值,可以覆蓋每個請求的視圖應該呈現到的佈局 。下面將呈現「家」視圖沒有佈局:

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.htmlviews/layouts/目錄。