2016-05-18 5 views
2

私はfs.readFileSyncでこれを簡単に達成しましたが、私はこれを非同期で行いたいと思います。私のコードは次のとおりです。非同期fs.readFileのコールバックにEJSを含むHTMLテンプレートをレンダリングしますか?

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); 

ファイルが読み込まれたとき、それはで適切な名前を入れて、電子メールをレンダリングし、その後nodemailerでそれをオフに送信されますようだから私はfs.readFileのための私自身のコールバックを作りました。しかし、それはこれを好まない。それは、テンプレートをレンダリングしようとすると、レンダリングに問題はなくレンダリングで次のエラーがスローされると、エラーが発生します。

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)

これを同期するとうまくいく。

var str = fs.readFileSync('emailTemplate.ejs', 'utf8'); 

    var template = ejs.render(str, { 
     name: data.name 
    }); 

なぜこのようなことが起こっているのか、誰にも分かりませんか?

答えて

0

fs.readFilefs.readFileSyncdocumentation

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

を言います。あなたはこれをしようとした場合

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

それが動作するはずです。

+0

私は 'utf8'と{encoding: "utf8"}の両方のエンコーディングで試しても、まだエラーが発生しています。 –

+0

レンダリングのオプションが間違った順序であることに気付きました。 'ejs.render( 'emailTemplate.ejs'、{{data.name}}、 'utf8');'実際には、あなたが提案したようにエンコーディングを組み込んでいます。ご協力いただきありがとうございます! –

0

は例えば、fs.readFileコールのエンコーディングを設定してみてください。:

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

readFileの呼び出しは非同期的にそこにはデフォルトのエンコーディングがなく、代わりに生のバッファを返すとき。現在、このバッファはEJS renderコールに送信され、失敗しています。

詳細については、node documentation for readFileを参照してください。あなたは、同期バージョンとエンコーディングを提供しますが、彼らは両方の動作が異なり、非同期1としないため、

関連する問題