我正在使用子进程和execFile()函数从节点运行PhantomJS脚本。
我将一个url从我的节点服务器传递给脚本作为参数。
有时网址会产生404,并且页面中没有找到脚本标记。这导致PhantomJS脚本崩溃,最终导致我的应用程序崩溃。
在以下代码中调用document.getElementsByTagName('script')[i].innerHTML
时如何处理空值?
"use strict";
var page = require('webpage').create();
var system = require('system');
var args = system.args;
page.open(args[1], function () {
var scriptCtnt = page.evaluate(function() {
for (var i = 0; i < 20; i++) {
var scriptStr = [].map.call(document.getElementsByTagName('script')[i].innerHTML, function(data) {
return data;
}).join('');
if (scriptStr.indexOf('some.field') !== -1) {
return scriptStr;
}
}
});
var str = scriptCtnt;
str = str.replace('//<![CDATA[','{');
str = str.replace(/}},/g,'}}');
var jsonStr = JSON.stringify(JSON.parse(str));
console.log(jsonStr);
phantom.exit();
});
N.B:我试图创建一个变量并检查未定义的值,但它没有用。我也无法在我的节点api中处理这个问题,因为既没有调用错误也没有调用stderr。
调用PhantomJS脚本的节点代码:
const execFile = require('child_process').execFile;
let bin = "phantomjs"
let args = ['./my.service.js', urlToScrape];
let jsonStr;
execFile(bin, args , (error, stdout, stderr) => {
if (error) {
return;
}
console.log(`stdout: ${stdout}`);
if (stdout) {
res.json(JSON.parse(stdout));
} else {
res.json(stderr);
}
});
编辑:
这是我尝试的方法之一,else返回一个空字符串,但这只是为了测试。
var scriptCtnt = page.evaluate(function() {
for (var i = 0; i < 20; i++) {
var elem = document.getElementsByTagName('script')[i].innerHTML;
if (typeof elem != 'undefined') {
var scriptStr = [].map.call(elem, function(data) {
return data;
}).join('');
if (scriptStr.indexOf('some.field') !== -1) {
return scriptStr;
}
} else {
return '';
}
}
});