Перехват движка представления expressjs вне контекста http res - PullRequest
3 голосов
/ 08 сентября 2011

Я создаю небольшое приложение, в первую очередь с сокетом io, но с некоторыми вещами из expressjs.

Одной из функций сокета io является отправка электронного письма при наступлении определенного события. У меня это нормально работает с node_mailer.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу использовать механизм экспресс-просмотра для рендеринга электронных писем из файлов шаблонов. Кажется, что метод рендеринга явно привязан к прототипу объекта res.

То, что я сделал, кажется довольно грязным:

// setup express server
var render;
app.get('/', function (req, res) {
    if (typeof render == 'undefined') render = res.render;
    res.end('Welcome to app');
});

// socket io code
socket.on('event', function (data) {
    var email_content;
    render('template', {}, function (err, result) { email_content = result; });
});

Есть ли лучший способ получить доступ к компонентам expressjs вне контекста http-запроса или даже лучший способ решить эту проблему? Я попытался настроить вызов экспортированной функции express.view.compile, но это не сработало и выглядело как высокая

Ответы [ 2 ]

1 голос
/ 28 октября 2012

На экспрессе 3.х есть псевдоним app.render

// socket io code
socket.on('event', function (data) {
  var email_content;
  app.render('template', {}, function (err, result) { email_content = result; });
});
1 голос
/ 03 ноября 2011

Вот откуда исходит информация, которую вы ищете:

https://github.com/Ravelsoft/node-jinjs/wiki

С шаблонами в качестве модулей Чтобы узел загружал ваши шаблоны, как если бы они были модулями, вы должны сначала зарегистрировать свойрасширение модуля:

require("jinjs").registerExtension(".tpl");

Если вы хотите, чтобы ваш файл был преобразован перед отправкой в ​​jinjs, вы можете передать обратный вызов;

var pwilang = require("pwilang");
require("jinjs").registerExtension(".pwx", function (txt) { 
    return pwilang.parse(txt); 
});

Теперь вы можете написать это пользователю Jin:

var my_template = require("./mytemplate");
var context = { foo: "foo", bar: "bar" };
var result = my_template.render(context);

Поскольку вы втыкаете Джина в экспресс (в отличие от работы с Джином в экспрессе), это ваш лучший вариант.Переменная res доступна только в обратном вызове маршрута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...