我很容易用fs.readFileSync完成这个,但我想以异步方式完成此操作。我的代码如下。
function send(err, str){
if(err){
console.log(err);
}
var template = ejs.render(str, 'utf8', {name: data.name});
transporter.sendMail({
from: myEmail,
to: anotherEmail,
subject: mySubject,
html: template,
attachments: images
}, function(err, response) {
if(err){
console.log(err);
}
});
}
fs.readFile('emailTemplate.ejs', send);
所以我为fs.readFile做了我自己的回调,这样当文件被读取时,它将呈现电子邮件,输入正确的名称然后用nodemailer发送。但是,它并不喜欢这样。如果没有问题但是渲染会在尝试渲染模板时抛出以下错误。
TypeError:Object(后跟模板的整个HTML)没有方法'indexOf' at Object.exports.parse(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:144:21) at exports.compile(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:229:15) at Object.exports.render(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:289:10) 发送(/home/ubuntu/workspace/routes/email.js:171:28) 在fs.readFile(fs.js:272:14) 在Object.oncomplete(fs.js:108:15)
同步执行它可以正常工作。
var str = fs.readFileSync('emailTemplate.ejs', 'utf8');
var template = ejs.render(str, {
name: data.name
});
任何人都可以告诉我为什么会这样吗?
答案 0 :(得分:0)
尝试设置fs.readFile
来电的编码,例如:
fs.readFile('emailTemplate.ejs', 'utf8', send);
异步调用readFile
时没有默认编码,而是返回原始缓冲区。目前,此缓冲区正在发送到EJS render
调用并失败。
有关详细信息,请参阅node documentation for readFile。
答案 1 :(得分:0)
fs.readFile
的{{3}}和fs.readFileSync
说
如果未指定编码,则返回原始缓冲区。
因为您使用同步版本提供编码,但不使用异步版本,因此它们的行为都不同。
如果您尝试这样做:
fs.readFile('emailTemplate.ejs', {encoding: "utf8"}, send);
它应该有用。