将 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 错误
,但 Express 无法与开箱即用的 Hogan 配合使用(请参阅下面 Linus G Thiel 的回答) - 导致
500错误
的原因似乎是我正在使用虚拟主机,当我调用 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
虚拟主机,或者当我切换虚拟主机声明的顺序以在datavizblocks
虚拟主机之后声明dataviz
虚拟主机时,500错误
就会消失(当然,这会导致datavizblocks
虚拟主机出现问题)
对于这个令人困惑的问题提前表示歉意,但当我遇到这个问题时我真的很困惑,并且没想到切换到 Hogan
会与虚拟主机发生冲突。
最佳答案
问题是 Express 需要来自模板引擎的接口(interface),其中模板引擎需要有一个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);
}
}
});
基本上,我们只是创建自己的对象,该对象具有映射到 Hogan 的 render
方法的 compile
方法。
这期望您的模板被命名为例如index.hogan
.
关于templates - 将 hogan.js 与express.js + 虚拟主机结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9732644/