将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
。