服务器代码中无法识别流星模板

时间:2015-08-30 22:43:07

标签: javascript email templates meteor server

我正在Meteor中构建应用程序,我正在尝试从服务器端方法发送电子邮件。电子邮件的模板存在于我的client / views文件夹中。因此,当我尝试从服务器端代码发送电子邮件时,我收到错误'模板未定义'。这是我的代码:

/server/methods/sendemail.js

var html = Blaze.toHTMLWithData(Template.emailToCustomer, dataContext);
Meteor.call('sendEmail',
                 thisUser.emails[0].address,
                'mine@mine.org',
                'yours@gmail.com',
                 'email subject',
                  html
                );

我的电子邮件模板只是一个简单的html页面。请注意,如果此代码存在于client / views / mytemplate.js中,则此代码可以正常工作。但是,由于技术原因,我需要从服务器端代码发送电子邮件。

我尝试将mytemplate.html和mytemplate.js文件放在app / both和app / server文件夹中,但我仍然得到模板未定义的错误。

任何人都有任何想法可能会发生什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的模板是在客户端目录下定义的,因此它们在服务器上下文中不可用是正常的。

不幸的是,即使您将模板移动到客户端和服务器都可用的共享目录,目前也无法使用vanilla Meteor API访问Blaze模板。

然而,您可以使用meteorhacks:ssr来定义您将能够使用标准Spacebars语法呈现的仅服务器模板。

您需要将服务器模板放在仅服务器private目录下,并使用以下命令在服务器代码中编译它们:

SSR.compileTemplate("emailToCustomer", Assets.getText("emailToCustomer.html"));

服务器模板不需要<template>标记,您可以立即定义它们:

private/emailToCustomer.html

<p>Hello {{name}}</p>
<p>This is server-side rendering !</p>

在您的服务器代码中,一旦编译了模板,您就可以像在标准客户端Blaze模板中那样定义帮助程序:

Template.emailToCustomer.helpers({
  name: function(){
    return this.firstName + " " + this.lastName;
  }
});

然后您可以使用以下方式渲染模板:

var html = SSR.render("emailToCustomer", {
  firstName: "John",
  lastName: "Doe"
});