在异步fs.readFile的回调中使用EJS呈现HTML模板?

时间:2016-05-18 03:52:19

标签: javascript node.js asynchronous ejs nodemailer

我很容易用fs.readFileSync完成这个,但我想以异步方式完成此操作。我的代码如下。

    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(后跟模板的整个HTML)没有方法'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)       发送(/home/ubuntu/workspace/routes/email.js:171:28)       在fs.readFile(fs.js:272:14)       在Object.oncomplete(fs.js:108:15)

同步执行它可以正常工作。

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

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

任何人都可以告诉我为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

尝试设置fs.readFile来电的编码,例如:

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

异步调用readFile时没有默认编码,而是返回原始缓冲区。目前,此缓冲区正在发送到EJS render调用并失败。

有关详细信息,请参阅node documentation for readFile

答案 1 :(得分:0)

fs.readFile的{​​{3}}和fs.readFileSync

  

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

因为您使用同步版本提供编码,但不使用异步版本,因此它们的行为都不同。

如果您尝试这样做:

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

它应该有用。