我正在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文件夹中,但我仍然得到模板未定义的错误。
任何人都有任何想法可能会发生什么?
谢谢!
答案 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"
});