Ich habe dies leicht mit dem fs.readFileSync erreicht, aber ich möchte dies asynchron tun. Mein Code folgt.Rendern von HTML-Vorlage mit EJS in einem Rückruf für asynchrone fs.readFile?
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);
Also machte ich meine eigenen Rückruf für fs.readFile so dass, wenn die Datei, um sie die E-Mail übertragen werden gelesen wurde, in den richtigen Namen setzen und es dann mit nodemailer abschicken. Es mag das jedoch nicht. Es kommt durch den Fehler, wenn kein Problem, aber render wirft den folgenden Fehler, wenn es versucht, die Vorlage zu rendern.
TypeError: Object (Followed by the entire HTML of the template) has no method '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) at send (/home/ubuntu/workspace/routes/email.js:171:28) at fs.readFile (fs.js:272:14) at Object.oncomplete (fs.js:108:15)
tun es funktioniert synchron jedoch in Ordnung.
var str = fs.readFileSync('emailTemplate.ejs', 'utf8');
var template = ejs.render(str, {
name: data.name
});
Kann mir jemand einen Einblick geben, warum das passiert?
Ich habe gerade versucht mit der Codierung, sowohl 'utf8' und {encoding: "utf8"} und immer noch den Fehler zu bekommen. –
Mir wurde klar, dass ich die Optionen in der falschen Reihenfolge rendern musste. 'ejs.render ('emailTemplate.ejs', {{data.name}}, 'utf8');' Es funktioniert in der Tat mit der Einbeziehung der Codierung, wie Sie vorgeschlagen haben. Danke für Ihre Hilfe! –