2016-05-18 5 views
2

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?

Antwort

0

Die documentation von fs.readFile und fs.readFileSync sagt

If no encoding is specified, then the raw buffer is returned.

Da Sie die Codierung mit der synchronen Version zur Verfügung stellen, aber nicht mit dem asynchron man sie beide im Verhalten unterscheiden.

Wenn Sie dies versuchen:

fs.readFile('emailTemplate.ejs', {encoding: "utf8"}, send); 

sollte es funktionieren.

+0

Ich habe gerade versucht mit der Codierung, sowohl 'utf8' und {encoding: "utf8"} und immer noch den Fehler zu bekommen. –

+0

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! –

0

Versuchen Sie, die Codierung des fs.readFile Anrufs, z.B .:

fs.readFile('emailTemplate.ejs', 'utf8', send); 

Wenn readFile Aufruf asynchron gibt es keine Standard-Kodierung, und stattdessen gibt den rohen Puffer. Derzeit wird dieser Puffer an den EJS-Aufruf render gesendet und schlägt fehl.

Weitere Informationen finden Sie unter node documentation for readFile.