Express忽略views目录

时间:2014-02-20 12:15:15

标签: javascript node.js express

我已经设置了一个配置文件来存储我的快递应用程序的应用程序路径,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');
};
在app.js文件的最后,

app.log的app对象(var app = express();)。

...
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变量。问题是如何调试/修复此问题?

3 个答案:

答案 0 :(得分:8)

在黑暗中拍摄,但我只是阅读express3-handlebars文档。

  

布局

     

布局只是一个带有{{{body}}}的Handlebars模板   占位符。通常它将是一个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,并将其设置为与Express视图相同的目录:

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

答案 1 :(得分: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/目录中。

答案 2 :(得分:0)

Handlebar似乎并不关心express的views属性,所以要么你需要定义app.locals.layouthttp://expressjs.com/api.html#app.locals),要么设置你的把手配置对象的defaultLayout属性的绝对路径

https://www.npmjs.org/package/express3-handlebars