2013-12-17 16 views
5

Jestem nowicjuszem dla nodejs, próbuję to zrobić, aby zeskanować cały URL mojej strony (z włączonymi javascript i jquery) i sprawdzić, czy URL zawiera podany ciąg znaków.Błąd rzucania Jsdom dla niektórych adresów URL

Aby to zrobić, używam jsdom, ale kiedy uruchomić skrypt wyodrębnia tylko jakiś URL, a następnie rozbija daje ten błąd:

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) 

Na pewno coś jest nie tak, ale nie rozumiem, gdzie. .

to jest mój skrypt:

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

Mam ten sam problem, ale tylko w przypadku niektórych adresów URL. Nie określiłem jeszcze, czy jest to błąd rzucany przez faktyczne wykonywanie skryptów w zeskanowanym html, czy też jest to błąd wewnętrzny w kodzie jsdom. Znaki wskazują na obie teraz :) –

+0

Złożyłem żądanie ściągnięcia zgodnie z poradą @faridNouriNeshat: https://github.com/tmpvar/jsdom/pull/1186 –

Odpowiedz

3

Wynika to gdzieś w stronie są Calling setTimeout/setInterval sznurkiem, który nie jest obsługiwany węzeł i powoduje to błąd.

Aby dowiedzieć się, skąd się bierze, sugeruję po prostu wymagać modułu longjohn (require('longjohn')), a otrzymasz długie ślady stosu, które pomogą ci znaleźć błąd. Na przykład mam coś takiego od robienia tego w repl:

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) 

Jeśli przypadkiem, że nie działa dla Ciebie lub nie podoba, to proponuję, aby zmodyfikować ten plik jsdom: node_modules/jsdom/lib/jsdom/browser/index.js, funkcja startTimer. Zgłaszaj tam błąd, jeśli callback nie jest funkcją. Zostanie to rzucone za każdym razem, gdy zostanie naruszony kod.

Jeśli używasz kodu, którego nie możesz zmienić (np. Z witryn, które nie są Twoją własnością, czego nie sugeruję, ponieważ obce javascript może zostać użyte do zaatakowania Twojej aplikacji), możesz przesłania DOMWindow.setTimeout/.setInterval w celu obsługi argumentów łańcuchowych. Możesz także otworzyć problem dla jsdom, aby mieć tę opcję.

Powiązane problemy