Javascript 在异步fs.readFile的回调中使用EJS呈现HTML模板?
我用fs.readFileSync很容易地完成了这一点,但我想异步完成这一点。我的代码如下Javascript 在异步fs.readFile的回调中使用EJS呈现HTML模板?,javascript,node.js,asynchronous,ejs,nodemailer,Javascript,Node.js,Asynchronous,Ejs,Nodemailer,我用fs.readFileSync很容易地完成了这一点,但我想异步完成这一点。我的代码如下 function send(err, str){ if(err){ console.log(err); } var template = ejs.render(str, 'utf8', {name: data.name}); transporter.sendMail({ from:
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发送。但是,它不喜欢这样。如果没有问题,则返回错误,但render在尝试渲染模板时抛出以下错误
TypeError:对象(后跟模板的整个HTML)没有方法“indexOf”
在Object.exports.parse(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:144:21)
在exports.compile(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:229:15)
在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
});
有人能告诉我为什么会发生这种情况吗?尝试设置
fs.readFile
调用的编码,例如:
fs.readFile('emailTemplate.ejs', 'utf8', send);
异步调用readFile
时,没有默认编码,而是返回原始缓冲区。当前,此缓冲区正在发送到EJSrender
调用,但失败
有关更多信息,请参见。的fs.readFile
和fs.readFileSync
的
如果未指定编码,则返回原始缓冲区
因为您使用同步版本提供编码,而不使用异步版本,所以它们在行为上都有所不同
如果您尝试以下方法:
fs.readFile('emailTemplate.ejs', {encoding: "utf8"}, send);
它应该可以工作。我刚刚尝试了编码,包括“utf8”和{encoding:“utf8”},但仍然出现了错误。我意识到我的渲染选项顺序错误<代码>ejs.render('emailTemplate.ejs',{data.name}},'utf8')它实际上可以按照您的建议包含编码。谢谢你的帮助!