如何在Node.js中使用Express、Handlebars和Conslidate设置部分文件路径

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.htmlarticle.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部分。

我认为我需要以某种方式将我的部分路径设置为绝对路径,但我不知道如何做到这一点。

2个回答

0

我有完全相同的问题。似乎“合并”正在重用你传递的“partials”对象,用文件内容替换值(呕!)。 一个解决方法是每次创建一个新的“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()});
};

并不是非常优雅,但我认为没有更简单的方法了。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接