Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在异步fs.readFile的回调中使用EJS呈现HTML模板?_Javascript_Node.js_Asynchronous_Ejs_Nodemailer - Fatal编程技术网

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

Javascript 在异步fs.readFile的回调中使用EJS呈现HTML模板?,javascript,node.js,asynchronous,ejs,nodemailer,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:

我用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
    });

有人能告诉我为什么会发生这种情况吗?

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

fs.readFile('emailTemplate.ejs', 'utf8', send);
异步调用
readFile
时,没有默认编码,而是返回原始缓冲区。当前,此缓冲区正在发送到EJS
render
调用,但失败

有关更多信息,请参见。

fs.readFile
fs.readFileSync

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

因为您使用同步版本提供编码,而不使用异步版本,所以它们在行为上都有所不同

如果您尝试以下方法:

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

它应该可以工作。

我刚刚尝试了编码,包括“utf8”和{encoding:“utf8”},但仍然出现了错误。我意识到我的渲染选项顺序错误<代码>ejs.render('emailTemplate.ejs',{data.name}},'utf8')它实际上可以按照您的建议包含编码。谢谢你的帮助!