Использование hogan.js с express.js + vhosts - PullRequest
0 голосов
/ 16 марта 2012

Как правильно использовать 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, Экспресс не работает с Хоганом из коробки (см. Ответ Линуса Г Тиля ниже)
  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 vhost или когда я переключаю порядок объявлений vhost, чтобы объявить dataviz vhost после datavizblocks vhost (конечно, это вызывает проблемы для datavizblocks vhost)

Заранее извиняюсь за запутанный вопрос, но я был очень смущен, когда столкнулся с этой проблемой, и никогда не ожидал, что переход на Hogan будет конфликтовать с виртуальным хостингом.

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Проблема заключается в том, что 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.

2 голосов
/ 23 ноября 2012

Как сказал Линус, вам нужен адаптер для использования Hogan с Express. Консолидация работает нормально, если вам не нужна поддержка партиалов или макетов (они работают над этим, но я не знаю, когда он будет готов).

Я был в том же месте, где вы были несколько месяцев назад, и нашел документацию Халка-Хогана и Экспресс-Хогана довольно запутанной, поэтому я написал свою собственную оболочку, которая поддерживает партиалы, макеты, кэширование шаблонов и может быть подключил Экспресс в одной строке кода. Вы можете проверить это здесь: h4e - шаблонизация с hogan для экспресса

...