我使用node读取文件,然后根据该文件中的某些信息编译pdf。我已经完成了我想做的所有事情,所以我不认为细节很重要。当我手动逐行输入它时,它确实完成了我需要它做的事情,但是当我尝试让节点作为javascript文件执行整个事情时,它会抛出错误,说我有未定义的变量。这是我的剧本:
var PDFDocument = require('pdfkit');
var hummus = require('hummus')
var fs = require('fs');
var parse = require('csv-parse');
var tabDelimitedText = fs.readFileSync('/volumes/merge central/fip automation/working/tab-delimited.txt',{encoding:"UTF-8"})
var parsedText;
parse(tabDelimitedText , {delimiter:"\t"}, function(err, output){parsedText = output});
//get client info from parsed text
var orderNumber = parsedText[1][0];
var clientName = parsedText[1][1];
var coverText = "FIP_" + orderNumber + " " + clientName;
var finishedPDFName = '/volumes/merge central/fip automation/~~~orders/FIP_' + orderNumber + "." + clientName + ".pdf"
var qtyColumn = 2;
var fileNameColumn = 3;
//this section is making the coverpage with pdfkit
var pageOptions = {size:[432,450]};
doc = new PDFDocument(pageOptions);
doc.pipe(fs.createWriteStream(finishedPDFName));
doc.font('Helvetica-Bold').fontSize(25).text(coverText,0,200,{align:"center",width:432});
doc.end();
//opens the working pdf to be modified by hummus
var pdfWriter = hummus.createWriterToModify(finishedPDFName)
//this section appends files onto coverpage based on the tab delimited file
for (thisRow = 1; thisRow < parsedText.length; thisRow++) {
//gets data from parsed text file
var thisQty = parsedText[thisRow][qtyColumn];
var thisTrueQty = thisQty/6
var thisFileName = "FIP_" + parsedText[thisRow][fileNameColumn];
var thisPDFtoInsert = "/Volumes/MERGE CENTRAL/FIP AUTOMATION/Found Image Press Calendars/" + thisFileName;
for (i = 0; i < thisTrueQty; i++) {
pdfWriter.appendPDFPagesFromPDF(thisPDFtoInsert);
}
}
//closes pdf
pdfWriter.end();
我对节点很陌生,所以请原谅我的无知,但据我所知,节点很难异步,我认为这是我的问题。我猜测脚本在读取并完全解析该文件之前继续声明变量。我得到的错误是&#34;无法读取属性&#39; 1&#39;未定义&#34;引用行var orderNumber = parsedText[1][0];
。所以我的想法是当脚本试图执行时parsedText
正在被定义var orderNumber = parsedText[1][0];
我对正在发生的事情的理解是否正确?是否有任何解决方法可以强制脚本等到某些功能完成后再继续?我确定它不是太复杂,我想我在这里有点过头了,而且我没有运气搞清楚。任何帮助将不胜感激。
答案 0 :(得分:0)
欢迎使用Stack Overflow!
首先,没有必要原谅自己是一个新手,我们一直都在那里,你似乎已经在发表你的问题之前完成了你的研究。感谢学习新事物!
你说Node是异步的,在这种情况下,它意味着一些事情:
你应该将所有内容放在:
中parse(tabDelimitedText , {delimiter:"\t"}, function(err, output){
parsedText = output
//all the rest here
});
然后你会发现pdfWriter.end将在你的for循环完成它的工作之前执行。在这种情况下,您可以通过在最后一次迭代后从循环中调用.end()来解决此问题:
//this section appends files onto coverpage based on the tab delimited file
for (thisRow = 1; thisRow < parsedText.length; thisRow++) {
//gets data from parsed text file
var thisQty = parsedText[thisRow][qtyColumn];
//if (thisQty != "") {
var thisTrueQty = thisQty/6
var thisFileName = "FIP_" + parsedText[thisRow][fileNameColumn];
var thisPDFtoInsert = "/Volumes/MERGE CENTRAL/FIP AUTOMATION/Found Image Press Calendars/" + thisFileName;
//inserts the pdf thisQty times
for (i = 0; i < thisTrueQty; i++) {
pdfWriter.appendPDFPagesFromPDF(thisPDFtoInsert);
if(i==thisTrueQty-1){
//closes pdf
pdfWriter.end();
}
}
//}
}
避免在回调内部的回调内部进行回调的一种方法是使用Q或async等库,这将使您能够进行同步行为。但我想你首先必须意识到Pyramid Of Doom是什么!