Email 在http res上下文之外劫持expressjs视图引擎

Email 在http res上下文之外劫持expressjs视图引擎,email,templates,node.js,Email,Templates,Node.js,我正在构建一个主要使用socket io的小应用程序,不过还有一些来自expressjs的东西 socket io部件的一个功能是在特定事件发生时发送电子邮件。我和node_mailer合作得很好 我遇到的问题是,我想使用express view引擎来呈现来自模板文件的电子邮件。渲染方法似乎显式地附加到res对象原型 我所做的感觉相当肮脏: // setup express server var render; app.get('/', function (req, res) { if

我正在构建一个主要使用socket io的小应用程序,不过还有一些来自expressjs的东西

socket io部件的一个功能是在特定事件发生时发送电子邮件。我和node_mailer合作得很好

我遇到的问题是,我想使用express view引擎来呈现来自模板文件的电子邮件。渲染方法似乎显式地附加到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; });
});

有没有更好的方法可以在http请求的上下文之外访问expressjs的组件,或者更好的方法来解决这个问题?我尝试调用exported express.view.compile函数,但这两个函数都不起作用,而且看起来像是一个高难度的函数

使用模板作为模块 要让节点像加载模块一样加载模板,首先必须注册模块扩展:

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);

因为你要让Jin加入express(而不是让express与Jin合作),这是你最好的选择。res变量仅在路由回调中可用。

在express 3.x上有别名
app.render

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

您正在使用哪个模板引擎?Jade?JinJS,我觉得express对于它使用的模板引擎有点不可知。它要求模板引擎导出一组特定的接口实现,以便与express兼容。express构建在connect上,connect的设计尽可能不可知,而express主要添加了一些合理的默认值。一个
var render=require('JinJS')。render
或类似的东西最好是imo.var render=require('JinJS')。render这是从哪里得到的?var render=require('JinJS')。渲染显然不起作用。。“或诸如此类”基本上正是我在这个问题中要问的——在扫描代码并尝试几种访问Expresss view引擎组件的方法之后,我无法将模板呈现为字符串。我最终将请求移动到http(使用ajax,而不是通过套接字操作触发电子邮件),但考虑让电子邮件排队并成批发送—使用这些工具如何实现这一点?