PhantomJS:如何在迭代脚本标签时检查null?

时间:2017-04-25 13:40:30

标签: javascript node.js phantomjs

我正在使用子进程和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 '';
        }        
      } 
  });

0 个答案:

没有答案