用EJS在asynchronousfs.readFile的callback中呈现HTML模板?

我很容易用fs.readFileSync完成这个工作,但是我想这样做是asynchronous的。 我的代码如下。

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做了我自己的callback,这样当文件被读取后,它将呈现电子邮件,把正确的名称放入然后用nodemailer发送出去。 但是,它不喜欢这个。 如果没有问题,它会得到错误,但是当渲染模板时呈现下列错误。

TypeError:Object(跟在模板的整个HTML之后)在导出时在Object.exports.parse(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:144:21)处没有方法“indexOf”。编译(/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 )在fs.readFile(fs.js:272:14)上发送(/home/ubuntu/workspace/routes/email.js:171:28)在Object.oncomplete(fs.js:108:15)

这样做虽然同步工作正常。

  var str = fs.readFileSync('emailTemplate.ejs', 'utf8'); var template = ejs.render(str, { name: data.name }); 

任何人都可以告诉我为什么会发生这种情况?

fs.readFilefs.readFileSync的文档说

如果没有指定编码,则返回原始缓冲区。

因为你提供了同步版本的编码,但是不要与asynchronous版本一样,它们在行为上都有所不同。

如果你尝试这个:

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

它应该工作。

尝试设置fs.readFile调用的编码,例如:

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

当asynchronous调用readFile ,没有默认编码,而是返回原始缓冲区。 目前,这个缓冲区正在被发送到EJS render调用和失败。

有关更多信息,请参阅readFile的节点文档 。