将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
vhost时,或当我切换vhost声明的顺序以便在dataviz
之后声明datavizblocks
vhost时,datavizblocks
消失了vhost(当然,这会导致Hogan
vhost的问题)
对这个令人困惑的问题提前道歉,但当我遇到这个问题时我真的很困惑,并且从未预料到切换到{{1}}会与虚拟主机发生冲突。
答案 0 :(得分:4)
问题是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);
}
}
});
基本上,我们只是创建自己的对象,其中compile
方法映射到Hogan的render
方法。
这需要将您的模板命名为例如index.hogan
。
答案 1 :(得分:2)
正如Linus所说,你需要一个适配器来使用Hogan和Express。只要你不需要支持部分或布局(他们正在努力但我不知道什么时候准备就绪),巩固工作正常。
我在几个月前就在同一个地方,发现了hulk-hogan和表达hogan的文件非常令人困惑所以我编写了自己的包装,它有支持对于局部,布局,模板缓存,可以在一行代码中插入Express。您可以在此处查看:h4e - templating with hogan for express