我是node.js和phantom.js的新手,所以我不确定如何更好地利用它们比我在下面所做的更好。
我有100多所学校的着装价格表,可以从相应的学校页面下载为PDF格式。我们所做的是生成PDF并在一夜之间上传到服务器。
现在我们想要使用node.js和phantom.js批量生成PDF并尽可能地自动化该过程。
下面的链接不是价格表页面,而是用于测试PDF的示例网址。
```
var schedule = require('node-schedule'),
path = require('path'),
childProcess = require('child_process'),
phantomjs = require('phantomjs'),
binPath = phantomjs.path,
childArgs = [
// phantomjs rasterize.js http://codefight.org codefight.pdf
path.join(__dirname, 'rasterize.js'),
'http://codefight.org/',
'codefight.pdf',
'400*300'
]
// add all the URLs and name of PDF here
var pdfSources = [
['codefight.pdf', 'http://codefight.org/'],
['dltr.pdf', 'http://dltr.org/']
];
// schedule generating PDFs
// running every minute for now to test
var j = schedule.scheduleJob('* * * * *', function(){
// loop through the pdfSources and generate new PDFs
pdfSources.forEach(function(item, index){
// update childArgs
childArgs[1] = item[1]; // pdf content source url
childArgs[2] = item[0]; // pdf filename
childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) {
// for some reason childArgs[2] always prints last item of pdfSources
// not sure how to make it work :(
console.log('New PDF - "' + childArgs[2] + '" generated!');
console.log(err + stdout + stderr);
});
});
});
```
1。我想知道为什么console.log('New PDF - "' + childArgs[2] + '" generated!');
始终打印相同的输出。即“新PDF - ”dltr.pdf“生成!”
2。有没有更好的方法来实现与node.js&相同的事情。 phantom.js和你想建议的任何改进?
谢谢!
答案 0 :(得分:1)
答案1.由于execFile
的异步性质,输出相同。基本上在forEach
循环中,您将值分配给childArgs[2]
并调用execFile
但是它的回调被放入队列然后在第二个循环中覆盖childArgs[2]
并调用execFile再次。现在是回调运行的时间,但事情是childArgs[2]
具有您为其分配的最后一个值。解决方法可能是将execFile放入一个像bellow
(function(cArgs){
childProcess.execFile(binPath, cArgs, function(err, stdout, stderr) {
console.log('New PDF - "' + cArgs[2] + '" generated!');
console.log(err + stdout + stderr);
});
})(childArgs);
我对问题2没有任何补充。