2012-03-16 66 views
0

在express.js中使用hogan.js的正确方法是什么?在express.js + vhosts中使用hogan.js

我已尝试以下步骤:依次按

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

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

但我结束了以下错误:

500 Error: Cannot find module 'hogan' 

TJ推出一个名为巩固库.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,它工作的很好,如果我也可以在服务器上使用它,那会更好。

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

  1. 尽管这不是造成500 error,Express不与霍根开箱(见:下面莱纳斯摹希尔的回答)
  2. 什么似乎是造成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将与虚拟主机冲突。

回答

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方法映射到霍根的render方法。

这需要您的模板被命名为例如index.hogan

+0

啊!当然!很好的回答......有趣的是,这与我为了让Hogan与Backbone(拍额头)一起工作而做的非常相似......我稍后会核实...... – uglymunky 2012-03-16 18:55:05

+0

看起来像别的东西是错的。我添加了这个代码,但是我仍然得到相同的错误:错误:当我尝试加载页面时找不到'hogan.js'模块 – uglymunky 2012-03-17 00:49:29

+0

你确定已经安装了'hogan.js'吗?还有一个模块'hogan '在npm注册表中,我不确定你想要什么,但是'hogan.js'看起来更加活跃。 – 2012-03-17 10:24:02

2

正如Linus所说,你需要一个适配器来使用Hogan和Express。只要你不需要支持partials或布局(他们正在处理它,但我不知道它什么时候会准备好),就可以整合工作正常。

我和你几个月前在同一个地方,发现hulk-hogan和express-hogan的文档是相当混乱的,所以我编写了自己的包装,支持partials,布局,模板缓存,并且可以通过一行代码插入Express。你可以看看这里:h4e - templating with hogan for express

+0

欢迎来到堆栈溢出!感谢您发布您的答案!请务必阅读[自我推销的常见问题](http:// stackoverfl ow.com/faq#promotion)。 – 2012-11-23 19:44:28

+0

此外,您的答案并不真正解决被问到的*特定问题。在这种情况下,广告您自己的代码通常不被接受为合适的答案。 – 2012-11-23 19:45:42

+1

对不起。我把它发布在这里,因为我相信它确实回答了这个问题。有两种方法可以将hoganjs连接到expressjs:手动或使用包装器。手动是一种痛苦(不难但仍然),而且我在编写这个(hulk-hogan和express-hogan)之前发现的两个包装文件都很差,很难理解。当然,我可以在我的答案中包括这个。 – 2012-11-26 08:40:08