javascript - NodeJS Html-pdf : fs. readfilesync 如何异步/等待

标签 javascript node.js express mongoose html-pdf

我在创建 html-pdf 文档时遇到问题。问题在于,代码通常运行速度太快才能完成 pdf 文档创建过程。该过程包括通过替换 Html 文件中的占位符来构建 HTML 字符串。下面您可以看到代码之后发生的情况。

                            Object.keys(setter).forEach(function(element, key, _array) {
                              var regex = new RegExp(element, "g");

                              data = data.replace(regex, setter[element])
                            })

                            var result = data;

                            fs.writeFile(mergeFileRes, result, 'utf8', function (err) {
                                if(err) { 
                                    console.log(err); 
                                    return;
                                } else {

                                    let html2 = fs.readFileSync(mergeFileRes, 'utf8');
                                    let options = { 
                                        format: 'a4' , 
                                        "directory" : "/tmp",
                                    };                            

                                    if(html2){
                                        pdf.create(html2, options).toStream(function(err, stream2){
                                            if(err)  console.log(err);
                                            stream2.pipe(res);

                                            stream2.on('end', function () {
                                                try{
                                                    fs.unlink(mergeFileRes)
                                                    console.log(3090, "deleted file");
                                                }
                                                catch (err){
                                                    console.log(3090, "Did not delete file");
                                                }
                                            });
                                        });
                                    } else {

                                    }
                                }
                            });

我的问题是,在许多情况下,在 pdf.create 进程开始之前尚未创建 html2 变量。这可能是因为 readFileSync 需要很长时间才能完成。

我想知道如何解决这个问题。如何让 pdf.create 等待 readFileSync 完成并填充 html2 变量。

最佳答案

您可以使用fs.readFile异步读取文件,并且html2将在回调函数中可用。

Object.keys(setter).forEach(function(element, key, _array) {
    var regex = new RegExp(element, "g");

    data = data.replace(regex, setter[element])
})

var result = data;

fs.writeFile(mergeFileRes, result, 'utf8', function (err) {
    if(err) { 
        console.log(err); 
        return;
    } else {

        fs.readFile(mergeFileRes, 'utf8', function(err, html2){
            if (err) throw err;

            let options = { 
                format: 'a4' , 
                "directory" : "/tmp",
            };                            

            pdf.create(html2, options).toStream(function(err, stream2){
                if(err)  console.log(err);
                stream2.pipe(res);

                stream2.on('end', function () {
                    try{
                        fs.unlink(mergeFileRes)
                        console.log(3090, "deleted file");
                    }
                    catch (err){
                        console.log(3090, "Did not delete file");
                    }
                });
            });
        });
    }
});

关于javascript - NodeJS Html-pdf : fs. readfilesync 如何异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54478441/

相关文章:

node.js - 两个通配符路由在 react 路由中意味着什么?

ios - FCM - node.js 中的定时器功能

node.js - 使用没有子域的 Nginx 设置多个 Node 服务器

javascript - 为什么我的异步函数返回一个空数组?

javascript - 有人可以解释为什么这个 for 循环打印出这个特定的模式吗?

javascript - JavaScript 数组中需要迭代器吗?

node.js - 渲染 javascript 函数返回,其中包含链接

javascript - $(window).scroll(function() {...}) 未在 Bootstrap v3.2 中加载?

javascript - 根据图像的高度/宽度定位图像

node.js - 路由请求挂起