将hogan.js与express.js结合使用的正确方法是什么?

我尝试了以下方法:

var hogan = require('hogan.js')
...
app.set('view engine', 'hogan');


其次是

app.register('.hogan', hogan);


但我最终遇到以下错误:

500 Error: Cannot find module 'hogan'


TJ推出了一个名为consolidate.js(https://github.com/visionmedia/consolidate.js)的库,但是我无法使其与Express 2.5.8一起使用。在花了一天时间试图弄清楚这一点之后,我还遇到了一个名为hulk-hogan.js(https://github.com/quangv/hulk-hogan)和另一个名为hogan-express(http://allampersandall.blogspot.com/2011/12/hoganjs-expressjs-nodejs.html)的库。但是,我真的需要所有这些吗?

如果解决方案不能像使用app.set()和app.register()设置模板引擎那样简单,那么有人可以帮助我理解原因将是很棒的。我在客户端上使用Hogan,而且效果很好,如果我也可以在服务器上使用它,那就更好了。

更新:原来这里有两个问题。


虽然这不会导致500 error,但Express不能与Hogan配合使用(请参阅:下面的Linus G Thiel的回答)
导致500 error的原因似乎是我正在使用虚拟主机,并且当我调用res.render()时,我的res.render()调用实际上是在调用另一个虚拟主机上的res.render()。我的服务器


添加完整的Express错误转储。看来我的应用程序('dataviz')尝试使用来自其他应用程序('datavizblocks')的渲染调用?同样,这两个应用程序是同一台服务器上的虚拟主机。

dataviz 8000
Error: Cannot find module 'hogan.js'
    at Function._resolveFilename (module.js:332:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:354:17)
    at require (module.js:370:17)
    at View.templateEngine (/localhost/datavizblocks/node_modules/express/lib/view/view.js:134:38)
    at Function.compile (/localhost/datavizblocks/node_modules/express/lib/view.js:68:17)
    at ServerResponse._render (/localhost/datavizblocks/node_modules/express/lib/view.js:417:18)
    at ServerResponse.render (/localhost/datavizblocks/node_modules/express/lib/view.js:318:17)
    at /localhost/dataviz/routes/section.js:325:7
    at callbacks (/localhost/dataviz/node_modules/express/lib/router/index.js:272:11)
dataviz 8000
Error: Cannot find module 'hogan.js'
    at Function._resolveFilename (module.js:332:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:354:17)
    at require (module.js:370:17)
    at View.templateEngine (/localhost/datavizblocks/node_modules/express/lib/view/view.js:134:38)
    at Function.compile (/localhost/datavizblocks/node_modules/express/lib/view.js:68:17)
    at ServerResponse._render (/localhost/datavizblocks/node_modules/express/lib/view.js:417:18)
    at ServerResponse.render (/localhost/datavizblocks/node_modules/express/lib/view.js:318:17)
    at /localhost/dataviz/routes/section.js:325:7
    at callbacks (/localhost/dataviz/node_modules/express/lib/router/index.js:272:11)


当我注释掉500 error虚拟主机时,或者当我改变虚拟主机声明的顺序以在datavizblock虚拟主机之后声明dataviz虚拟主机时,datavizblocks消失了(当然,这会导致datavizblocks虚拟主机)

对于这个令人困惑的问题,我们会提前道歉,但是当我遇到这个问题时,我真的很困惑,从没想到切换到Hogan会与虚拟主机产生冲突。

最佳答案

问题是Express需要模板引擎的接口,该模板引擎应具有compile方法,而compile方法应返回可与模板数据一起调用的函数。

Hogan有一个compile方法,但是它返回一个有render方法的模板对象。您需要将该render方法公开给Express,而这似乎正是hogan-express模块的作用。虽然不必参与其中,但我认为这会起作用(我仅对其进行了少许测试,可能有些麻烦了?):

var express = require('express'),
    hogan = require('hogan.js'),
    app = express.createServer();

app.set('view engine', 'hogan');
app.register('hogan', {
    compile: function() {
        var t = hogan.compile.apply(hogan, arguments);
        return function() {
            return t.render.apply(t, arguments);
        }
    }
});


基本上,我们只是创建自己的对象,该对象具有映射到Hogan的compile方法的render方法。

期望您的模板被命名为index.hogan

10-02 08:54