2016-05-18 65 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); 

所以我做了我自己的fs.readFile回調,這樣當該文件已被讀取它將使電子郵件,把適當的名稱,然後用nodemailer把它關閉。但是,它不喜歡這樣。如果沒有問題,它會通過錯誤獲取,但在渲染模板時呈現以下錯誤。

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瞭解更多信息。