将hogan.js与express.js + vhosts一起使用

时间:2012-03-16 06:00:23

标签: templates node.js express hogan.js

将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并且它工作得很好,如果我也可以在服务器上使用它会更好。

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

  1. 虽然这不会导致500 error,但Express不能与开箱即用的Hogan一起使用(参见:Linus G Thiel的答案)
  2. 似乎导致500 error的是我正在使用虚拟主机,当我调用res.render()时,我的res.render()调用实际上是调用res.render()我同一台服务器上的不同虚拟主机。
  3. 添加完整的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}}会与虚拟主机发生冲突。

2 个答案:

答案 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