在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 )的库,但我很难让它使用Exchange2.5.8。在花了一天时间试图解决这个问题之后,我还遇到了一个名为hulk-hogan.js ( https://github.com/quangv/hulk-hogan )的库和另一个名为hogan.js( http://allampersandall.blogspot.com/2011/12/hoganjs-expressjs-nodejs.html )的库。但是,我真的需要这些吗?
如果解决方案不能像用app.set()和app.register()设置模板引擎那样简单,那么如果有人能帮助我理解原因,那就太好了。我在客户端上使用了Hogan,它运行得很好,如果我也能在服务器上使用它,那就好多了。
更新:这里有两个问题。
500 error的原因,但Express并不能开箱即用(参见: Linus下面的答案)。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)当我注释掉datavizblock vhost,或者切换vhost声明的顺序,使dataviz vhost在datavizblocks vhost之后声明(当然,这会给datavizblocks vhost带来问题),dataviz就会消失。
提前为这个令人困惑的问题道歉,但当我遇到这个问题时,我真的很困惑,没想到切换到Hogan会与虚拟主机发生冲突。
发布于 2012-03-16 11:06:24
问题是,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方法的render方法。
这要求您的模板命名为index.hogan。
发布于 2012-11-23 15:38:00
正如Linus所说,您需要一个适配器才能在Express中使用Hogan。只要您不需要对部分或布局的支持(他们正在处理它,但我不知道它什么时候准备好),它就能很好地工作。
几个月前,我也在你所在的位置,我发现hogan和Express -hogan的文档非常混乱,所以我编写了自己的包装器,它支持部分、布局、模板缓存,并且可以插入Express的一行代码。您可以在这里查看:h4e -用于特快的hogan模板
https://stackoverflow.com/questions/9732644
复制相似问题