express-handlebars 找不到我的布局或部分
express-handlebars isn't finding my layouts or partials
我有以下 Express 4 视图引擎设置:
var handlebars = require('express-handlebars').create({
layoutsDir: path.join(__dirname, "views/layouts"),
partialsDir: path.join(__dirname, "views/partials"),
defaultLayout: 'layout',
extname: 'hbs'
});
app.engine('handlebars', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
我有以下文件结构:
/views
error.hbs
index.hbs
/partials
menu.hbs
/layouts
layout.hbs
最后在我的路线中:res.render('index');
访问我的网站时,它只加载我的 index.hbs
模板。它不使用我的layout.hbs
。我没有得到任何错误或任何东西。它只是不使用布局,即使 layout
在车把配置中设置为我的默认布局。
接下来我尝试将我的代码更改为:
res.render('index', {layout: 'layout'});
现在我得到错误:
Error: ENOENT: no such file or directory, open '/.../views/layout.hbs'
好像找不到我的 layoutsDir
...我在这里错过了什么?
接下来我改成这样:
res.render('index', {layout: 'layouts/layout'});
好的,这样就成功了。我的布局现已加载。但后来我在布局中添加了一部分:
{{> menu }}
现在我得到:/.../views/index.hbs: The partial menu could not be found
所以这是怎么回事?为什么 Handlebars 无法识别我的 layoutsDir
或 partialsDir
?只是根本没有看到他们或其他什么。为什么 defaultLayout
没有被使用?我必须指定布局。
根据 express-handlebars 的 API documentation 如果您更改默认的文件扩展名 .handlebars
那么当您设置视图引擎时,所有出现的 handlebars 应替换为您希望使用的新扩展名。
因此您的快速设置需要更新为:
app.engine('hbs', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
注意:文档在扩展名之前使用句点,例如.hbs 但它似乎没有这个工作。
完整代码:
var path = require('path');
var express = require('express');
var app = express();
var http = require('http').Server(app);
var handlebars = require('express-handlebars').create({
layoutsDir: path.join(__dirname, "views/layouts"),
partialsDir: path.join(__dirname, "views/partials"),
defaultLayout: 'layout',
extname: 'hbs'
});
app.engine('hbs', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
app.get('/', function(req, res){
res.render('index');
});
http.listen(3000, function(){
console.log("Server running");
});
在您使用的新把手中,您不必将其目录包含在 server.js
中
- "express-handlebars"
中包含了偏音
- 视图引擎设置中的第一行负责上述内容
注意这些。
const hbs = require('hbs');
const expressHbs = require('express-handlebars');
//view engine setup
app.engine('.hbs', expressHbs({ defaultLayout: 'layout', extname: '.hbs' }));
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, '../views'));
app.use(express.static(path.join(__dirname, '../public')));
尝试在您的依赖项上使用通配符以确保您匹配最新版本
"dependencies": {
"express": "*",
"express-handlebars": "^3.0.0",
"hbs": "*"
},
我有以下 Express 4 视图引擎设置:
var handlebars = require('express-handlebars').create({
layoutsDir: path.join(__dirname, "views/layouts"),
partialsDir: path.join(__dirname, "views/partials"),
defaultLayout: 'layout',
extname: 'hbs'
});
app.engine('handlebars', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
我有以下文件结构:
/views
error.hbs
index.hbs
/partials
menu.hbs
/layouts
layout.hbs
最后在我的路线中:res.render('index');
访问我的网站时,它只加载我的 index.hbs
模板。它不使用我的layout.hbs
。我没有得到任何错误或任何东西。它只是不使用布局,即使 layout
在车把配置中设置为我的默认布局。
接下来我尝试将我的代码更改为:
res.render('index', {layout: 'layout'});
现在我得到错误:
Error: ENOENT: no such file or directory, open '/.../views/layout.hbs'
好像找不到我的 layoutsDir
...我在这里错过了什么?
接下来我改成这样:
res.render('index', {layout: 'layouts/layout'});
好的,这样就成功了。我的布局现已加载。但后来我在布局中添加了一部分:
{{> menu }}
现在我得到:/.../views/index.hbs: The partial menu could not be found
所以这是怎么回事?为什么 Handlebars 无法识别我的 layoutsDir
或 partialsDir
?只是根本没有看到他们或其他什么。为什么 defaultLayout
没有被使用?我必须指定布局。
根据 express-handlebars 的 API documentation 如果您更改默认的文件扩展名 .handlebars
那么当您设置视图引擎时,所有出现的 handlebars 应替换为您希望使用的新扩展名。
因此您的快速设置需要更新为:
app.engine('hbs', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
注意:文档在扩展名之前使用句点,例如.hbs 但它似乎没有这个工作。
完整代码:
var path = require('path');
var express = require('express');
var app = express();
var http = require('http').Server(app);
var handlebars = require('express-handlebars').create({
layoutsDir: path.join(__dirname, "views/layouts"),
partialsDir: path.join(__dirname, "views/partials"),
defaultLayout: 'layout',
extname: 'hbs'
});
app.engine('hbs', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
app.get('/', function(req, res){
res.render('index');
});
http.listen(3000, function(){
console.log("Server running");
});
在您使用的新把手中,您不必将其目录包含在 server.js
中- "express-handlebars" 中包含了偏音
- 视图引擎设置中的第一行负责上述内容
注意这些。
const hbs = require('hbs');
const expressHbs = require('express-handlebars');
//view engine setup
app.engine('.hbs', expressHbs({ defaultLayout: 'layout', extname: '.hbs' }));
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, '../views'));
app.use(express.static(path.join(__dirname, '../public')));
尝试在您的依赖项上使用通配符以确保您匹配最新版本
"dependencies": {
"express": "*",
"express-handlebars": "^3.0.0",
"hbs": "*"
},