2013-12-17 4 views
5

나는 nodejs에 익숙하지 않은데, 내 사이트의 모든 URL (javascript 및 jquery 사용)을 검사하고 URL에 주어진 문자열이 들어 있는지 확인합니다. 일부 URL에 Jsdom 오류가 발생했습니다.

내가 jsdom을 사용하고이 작업을 수행하려면,하지만 난 시작할 때 스크립트는이 오류를주는 충돌 후 일부 URL을 추출 :
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) 

는 분명히 뭔가 잘못하지만 난 어디를 이해하지 않습니다. .

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

동일한 문제가 있지만 일부 URL에서만 발생합니다. 나는 그것이 scraped html에서 스크립트의 실제 실행에 의해 던져지는 에러인지 또는 jsdom 코드의 내부 에러인지 여부를 아직 결정하지 못했다. 신호가 지금 두 지점을 가리킴 :) –

+0

@faridNouriNeshat의 조언에 따라 당겨 요청을했습니다. https://github.com/tmpvar/jsdom/pull/1186 –

답변

3

이 때문에 자신들이 지원되지 않는 문자열의 setTimeout/setInterval을 호출하는 페이지의 어딘가에이다 :

이 내 스크립트입니다 노드로 이동하면 오류가 발생합니다.

어디서 왔는지 알아 보려면 longjohn 모듈 (require('longjohn'))이 필요하고 긴 스택 추적이 필요하므로 오류를 찾는 데 도움이됩니다. 예를 들어 나는 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) 

당신을 위해 작동하지 않았거나 당신이 그것을 좋아하지 않았다 혹시, 나는 당신이 jsdom 파일을 수정하는 것이 좋습니다 경우 : node_modules/jsdom/lib/jsdom/browser/index.js, function startTimer. callback이 기능이 아닐 경우 오류를 던집니다. 문제가있는 코드가 실행될 때마다이 옵션이 반환됩니다.

변경할 수없는 코드를 실행하는 경우 (예 : 내가 소유하지 않은 웹 사이트에서와 같이 외부 자바 스크립트가 앱을 공격 할 수 있으므로 제안하지 않음) 캐릭터 라인 인수를 지원하기 위해서 DOMWindow.setTimeout/.setInterval를 오버라이드 (override)합니다. jsdom이이 옵트 인을 사용하는 데 문제가있을 수도 있습니다.