templates - 将 hogan.js 与express.js + 虚拟主机结合使用

标签 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 错误,但 Express 无法与开箱即用的 Hogan 配合使用(请参阅下面 Linus G Thiel 的回答)
  2. 导致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/

相关文章:

node.js - Gulp 在第一个 XHR 请求时崩溃并出现 HPE_INVALID_CONSTANT 错误

javascript - 在 node.js 中使用 chart.js 显示数组中的两个数据集

javascript - 如何查找表单参数的存储位置并在请求中使用它们

c++ - odr 使用的变量的模板 static constexpr 定义

c++ - 将类似数组的对象作为模板值参数

templates - 跨继承模板组合 Assetic 资源

javascript - 如何在express中使用路由路径?

c++ - 重载模板 <typename ...> 类的函数模板

node.js - 无法在 Centos 服务器上安装 bcrypt node.js 模块

node.js - 未解析的函数或方法 mongoose.connect() WebStorm