我正在 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 文件夹中,但仍然收到模板未定义错误。
有人知道会发生什么吗?
谢谢!
最佳答案
您的模板是在客户端目录下定义的,因此它们在服务器上下文中不可用是正常的。
遗憾的是,目前无法使用普通 Meteor API 访问 Blaze 模板,即使您将模板移动到客户端和服务器都可用的共享目录也是如此。
但是你可以做的是使用 meteorhacks:ssr
定义仅适用于服务器的模板,您可以使用标准空格键语法来呈现这些模板。
您需要将服务器模板仅放在服务器 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"
});
关于javascript - 服务器代码中无法识别 Meteor 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301867/