2013-12-17 10 views
5

Ich bin neu bei NodeJs, was ich versuche zu tun ist, um die gesamte URL meiner Website (mit Javascript und jquery aktiviert) zu überprüfen und überprüfen, dass die URL eine bestimmte Zeichenfolge enthält.Jsdom Wurf Fehler für einige URLs

Um dies zu tun, ich bin mit jsdom, aber wenn ich starte das Skript extrahiert nur eine URL und dann stürzt diesen Fehler geben:

timers.js:110 
    first._onTimeout(); 
     ^
TypeError: Property '_onTimeout' of object [object Object] is not a function 
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) 

Sicherlich ist es etwas falsch, aber ich verstehe nicht, wo. . mein Skript

Dies ist:

var request = require('request'); 
var jsdom = require('jsdom'); 

request({ uri: 'http://www.example.com' }, function (error, response, html) { 
    if (!error && response.statusCode == 200) { 

    var doc = jsdom.jsdom(html, null, { 
      features: { 
       FetchExternalResources : ['script'], 
       ProcessExternalResources : ['script'], 
       MutationEvents   : '2.0', 
      } 
    }); 

    var window = doc.createWindow(); 
    jsdom.jQueryify(window, "http://code.jquery.com/jquery-1.5.min.js", function() { 
     var $ = window.jQuery; 
     $('a').each(function(i, element){ 
      var a = $(this).attr('href'); 
      console.log(a); 
      if (a.indexOf('string') != -1) { 
       console.log('The winner: '+a); 
       //return a; 
      } 
     }); 
     window.close(); 
    }); 
    } 
}); 
+1

Ich habe das gleiche Problem, aber nur auf einigen URLs. Ich habe noch nicht festgestellt, ob es sich um einen Fehler handelt, der durch die tatsächliche Ausführung von Skripten im Scraped-HTML ausgelöst wird, oder ob es sich um einen internen Fehler im Jsdom-Code handelt. Zeichen zeigen auf beide gerade jetzt :) –

+0

Ich machte eine Pull-Anfrage gemäß @ faridNouriNeshat 's Rat: https://github.com/tmpvar/jsdom/pull/1186 –

Antwort

3

Dies liegt daran, von irgendwo auf Ihrer Seite sie setTimeout/setInterval mit einem String aufrufen, die in nicht unterstützt wird Knoten und es führt zu diesem Fehler.

Um herauszufinden, woher kommt es, ich schlage nur longjohn Modul (require('longjohn')) und Sie erhalten lange Stack-Traces, die sie Ihnen helfen, den Fehler zu finden. Zum Beispiel habe ich so etwas wie dies aus diesem in dem ers tun:

at listOnTimeout (timers.js:110:15) 
--------------------------------------------- 
    at startTimer (/home/alfred/repos/node_modules/jsdom/lib/jsdom/browser/index.js:75:15) 
    at DOMWindow.setTimeout (/home/alfred/repos/node_modules/jsdom/lib/jsdom/browser/index.js:124:50) 
    at file:///home/alfred/repos/repl:undefined:undefined<script>:1:1 
    at Contextify.sandbox.run (/home/alfred/repos/node_modules/jsdom/node_modules/contextify/lib/contextify.js:12:24) 
    at exports.javascript (/home/alfred/repos/node_modules/jsdom/lib/jsdom/level2/languages/javascript.js:5:14) 
    at define.proto._eval (/home/alfred/repos/node_modules/jsdom/lib/jsdom/level2/html.js:1523:47) 
    at /home/alfred/repos/node_modules/jsdom/lib/jsdom/level2/html.js:76:20 
    at item.check (/home/alfred/repos/node_modules/jsdom/lib/jsdom/level2/html.js:345:11) 

Wenn von einer Chance, die nicht für Sie arbeitet, oder Sie haben es nicht mögen, dann empfehle ich Ihnen diese jsdom Datei zu ändern: node_module/jsdom/lib/jsdom/browser/index.js, Funktion startTimer. Wirf einen Fehler dort, wenn callback keine Funktion war. Dies wird ausgelöst, sobald ein fehlerhafter Code ausgeführt wurde.

Im Falle, dass Sie Code ausführen, den Sie nicht ändern können (wie von Websites, die Sie nicht besitzen, die ich nicht vorschlagen, weil so ein fremder Javascript Ihre App angreifen könnte), könnten Sie überschreiben Sie DOMWindow.setTimeout/.setInterval, um Zeichenfolgenargumente zu unterstützen. Sie könnten auch ein Problem für jsdom öffnen, um diese Option zu aktivieren.

Verwandte Themen