3

我有一个可用的 Node.js 站点,使用 Express.js、Handlebars.js 和 Consolidate.js。我想将部分用于模板的公共部分,但不知道如何使它们适用于不同 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.htmlHandlebarsarticle.html模板中,我有类似的内容:

{{> header}}
<!-- page content here -->
{{> footer }}

我应该能够同时访问/(何时index.html呈现)和/foo/(何时article.html呈现)。但它只适用于我在启动节点服务器后首先尝试访问的任何一个。然后当我导航到另一条路径时,我收到如下错误:

Error: ENOENT, no such file or directory '/Users/phil/Projects/projectname/views/<!DOCTYPE html>...

其余_header.html部分如下。

我假设我需要以某种方式将我的局部路径设置为绝对路径,但我不知道该怎么做。

4

2 回答 2

0

对于合并检查:https ://github.com/tj/consolidate.js/issues/18

我建议切换到更具体的东西,比如https://github.com/donpark/hbs它会更简单。

于 2016-07-21T22:28:41.400 回答
0

我有同样的问题。似乎合并正在重用您传递的“部分”对象,用文件内容替换值(糟糕!)。一种解决方法是每次都创建一个新的“partials”对象。如果您不想每次都重写整个对象,可以使用返回对象字面量的函数。在您的情况下,应该可以使用以下方法:

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()});
};

不是很优雅,但我认为没有办法让它更简单。

于 2017-12-18T21:11:28.840 回答