Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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 NodeJS Html pdf:fs.readfilesync如何异步/等待_Javascript_Node.js_Express_Mongoose_Html Pdf - Fatal编程技术网

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

Javascript NodeJS Html pdf:fs.readfilesync如何异步/等待,javascript,node.js,express,mongoose,html-pdf,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");

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

readFileSync是一个同步调用,除非读取未完成,否则将无法继续。控制台在读取数据后读取数据。这可能是因为readFileSync需要很长时间才能完成-不,没有,正如名称所示,该函数是同步的。问题在别处,因此object.keys/data.replace函数可能花费的时间太长?我想你可能是对的。但是,我怎么能强迫代码等待这个过程完成呢?谢谢你的回答。代码运行正常,但仍然会不时出现此错误:GET/api/bill/pdf/5c52eba76369863df45f5712 200 2043.263 ms--assert.js:42抛出新错误。AssertionError({^AssertionError[ERR_ASSERTION]:html pdf:如果没有html字符串,则无法创建pdf。如果我告诉代码等待,怎么可能仍然没有html字符串?您的工作假设是
Object.keys(setter).forEach()在执行剩余代码之前已经完成了数据更新。但唯一可以保证的是,每个元素都调用回调。在等待之前,您不等待回调完成。您可能需要考虑使用“代码>誓言< /代码>系列,并且当最终承诺完成时,执行Co。这应该随之而来。