[英]Express ignoring views directory
我已经设置了一个配置文件来存储我的快递应用程序的应用程序路径,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对象(var app = express();)的console.log。
...
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变量。 问题是如何调试/修复此问题?
在黑暗中拍摄,但我只是阅读了express3-handlebars
docs。
布局
布局只是一个带有
{{{body}}}
占位符的Handlebars模板。 通常它将是一个HTML页面包装器,其中将呈现视图。此视图引擎添加了“布局”的概念,该概念已在Express 3.x中删除。 它可以配置一个layouts目录的路径,默认情况下它设置为“views / layouts /”。
设置默认布局有两种方法:配置视图引擎的
defaultLayout
属性,或设置Express locals app.locals.layout。通过为布局请求本地分配不同的值,可以按请求覆盖应该呈现视图的布局。 以下将呈现没有布局的“主页”视图:
app.get('/', function (req, res, next) { res.render('home', {layout: false}); });
也许它引用了__dirname+'/views'
并忽略了你在配置中设置的内容。
尝试像上面的代码一样添加{layout: false}
。 如果它有效,那么这就是你的问题。
持续阅读让我发现你可以改变把手寻找布局的位置。 您可以像使用defaultLayout
一样将layoutsDir
添加到配置中,并将其设置为与Express视图相同的目录:
var hbConfig = {
layoutsDir: path.join(app.settings.views, "layouts"),
defaultLayout: "default.html"
}
app.engine('html', require('express3-handlebars')(hbConfig));
尝试这个:
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/
目录中。
Handlebar似乎并不关心express的views
属性,所以要么你需要定义app.locals.layout
( http://expressjs.com/api.html#app.locals ),要么设置你的把手配置的绝对路径object的defaultLayout属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.