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

Meteor templates not recognized in server code

本文关键字:流星 识别 代码 服务器      更新时间:2023-09-26

我正在构建流星应用程序,我正试图从服务器端方法发送电子邮件。电子邮件的模板存在于我的客户端/视图文件夹中。因此,当我尝试从服务器端代码发送电子邮件时,我得到错误"模板未定义"。下面是我的代码:

/服务器/方法/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来定义服务器模板,你可以使用标准的空格语法来渲染。

你需要把你的服务器模板放在server only 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"
});