我有一个工作的Node.js站点,使用Express.js,Handlebars.js和Consolidate.js。我想对我的模板的常见部分使用partials,但无法弄清楚如何使它们适用于不同URL的页面。
我的/views/
目录包含:
_footer.html
_header.html
article.html
index.html
我的Node应用程序的相关部分类似于:
var express = require('express'),
consolidate = require('consolidate'),
handlebars = require('handlebars'),
path = require('path');
var app = express();
app.engine('html', consolidate.handlebars);
app.set('view engine', 'html');
app.set('views', path.join(__dirname, '/views'));
var partials = {header: '_header', footer: '_footer'};
app.get('/', function(req, res) {
res.render('index', {partials: partials});
};
app.get(/^\/([\w-]+)\/$/, function(req, res) {
res.render('article', {partials: partials});
};
在我的index.html
和article.html
Handlebars模板中,我有类似的内容:
{{> header}}
<!-- page content here -->
{{> footer }}
我应该能够同时访问/
(呈现index.html
时)和/foo/
(呈现article.html
时)。但它只适用于我在启动Node服务器后首先尝试访问的任何一个。当我然后导航到另一条路径时,我得到如下错误:
Error: ENOENT, no such file or directory '/Users/phil/Projects/projectname/views/<!DOCTYPE html>...
其余的_header.html
部分跟随。
我认为我需要以某种方式将我的部分路径设置为绝对的,但我不知道如何做到这一点。
答案 0 :(得分:0)
要合并检查:https://github.com/tj/consolidate.js/issues/18
我建议切换到更具体的内容,例如https://github.com/donpark/hbs它会更简单。
答案 1 :(得分:0)
我有同样的问题。似乎整合is reusing the "partials" object that you pass,用文件内容替换值(哎呀!)。 解决方法是每次都创建一个新的“部分”对象。如果您不想每次都重写整个对象,则可以使用返回对象文字的函数。 在你的情况下,类似下面的东西应该工作:
var express = require('express'),
consolidate = require('consolidate'),
handlebars = require('handlebars'),
path = require('path');
var app = express();
app.engine('html', consolidate.handlebars);
app.set('view engine', 'html');
app.set('views', path.join(__dirname, '/views'));
var partials = function() {
return {header: '_header', footer: '_footer'};
}
app.get('/', function(req, res) {
res.render('index', {partials: partials()});
};
app.get(/^\/([\w-]+)\/$/, function(req, res) {
res.render('article', {partials: partials()});
};
不是很优雅,但我认为没有办法让它变得更简单。