首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将hogan.js与express.js +vhost结合使用

将hogan.js与express.js +vhost结合使用
EN

Stack Overflow用户
提问于 2012-03-16 06:00:23
回答 2查看 3.9K关注 0票数 0

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

我试过以下几种方法:

代码语言:javascript
复制
var hogan = require('hogan.js')
...
app.set('view engine', 'hogan');

紧接着是

代码语言:javascript
复制
app.register('.hogan', hogan);

但我最后会犯以下错误:

代码语言:javascript
复制
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,它运行得很好,如果我也能在服务器上使用它,那就好多了。

更新:这里有两个问题。

  1. 虽然这并不是导致500 error的原因,但Express并不能开箱即用(参见: Linus下面的答案)。
  2. 导致500 error的原因似乎是,我使用的是虚拟主机,当我调用res.render()时,我的res.render()调用实际上是调用同一服务器上不同虚拟主机的res.render()。

添加完整的Express错误转储。看起来我的应用程序('dataviz')正在尝试使用来自不同应用程序的呈现调用('datavizblocks')?同样,这两个应用程序是同一台服务器上的虚拟主机。

代码语言:javascript
复制
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会与虚拟主机发生冲突。

EN

回答 2

Stack Overflow用户

发布于 2012-03-16 11:06:24

问题是,Express需要来自模板引擎的接口,其中模板引擎需要一个compile方法,而compile方法需要返回一个可以用模板数据调用的函数。

Hogan有一个compile方法,但是它返回一个模板对象,其中有一个render方法。您需要将该render方法公开给Express,这似乎就是hogan-express模块所做的。不过,这不应该涉及到这个问题,我认为这是可行的(我只对其进行了一些测试,可能是一些问题吗?):

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2012-11-23 15:38:00

正如Linus所说,您需要一个适配器才能在Express中使用Hogan。只要您不需要对部分或布局的支持(他们正在处理它,但我不知道它什么时候准备好),它就能很好地工作。

几个月前,我也在你所在的位置,我发现hogan和Express -hogan的文档非常混乱,所以我编写了自己的包装器,它支持部分、布局、模板缓存,并且可以插入Express的一行代码。您可以在这里查看:h4e -用于特快的hogan模板

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9732644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档