【问题标题】:Rendering HTML template with EJS in a callback for asynchronous fs.readFile?在异步 fs.readFile 的回调中使用 EJS 呈现 HTML 模板?
【发布时间】:2016-09-14 08:55:21
【问题描述】:

我使用 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 将其发送出去。但是,它不喜欢这样。如果没有问题,它会得到错误,但 render 在尝试渲染模板时会抛出以下错误。

TypeError: 对象(后跟模板的整个 HTML)没有方法 'indexOf' 在 Object.exports.parse (/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:144:21) 在exports.compile (/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) 在发送时(/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
    });

谁能告诉我为什么会发生这种情况?

【问题讨论】:

    标签: javascript node.js asynchronous ejs nodemailer


    【解决方案1】:

    fs.readFilefs.readFileSyncdocumentation 表示

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

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

    如果你试试这个:

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

    它应该可以工作。

    【讨论】:

    • 我刚刚尝试了编码,'utf8' 和 {encoding: "utf8"} 仍然得到错误。
    • 我意识到我的渲染选项顺序错误。 ejs.render('emailTemplate.ejs', {{data.name}}, 'utf8'); 实际上,它确实可以按照您的建议包含编码。感谢您的帮助!
    【解决方案2】:

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

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

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

    请参阅node documentation for readFile 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2014-04-14
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多