2013-12-17 54 views
5

我是nodejs的新手,我正在嘗試掃描我網站的所有網址(啓用javascript和jquery),並檢查URL是否包含給定的字符串。Jsdom爲某些URL拋出錯誤

要做到這一點我使用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

我有同樣的問題,但只在某些網站上。我還沒有確定是否是由於在被刮掉的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,函數startTimer。如果callback不是函數,則在那裏拋出錯誤。這將拋出每當有問題的代碼運行。

如果您正在運行的代碼無法更改(例如來自您不擁有的網站,我不建議這樣做,因爲外部JavaScript可以用來攻擊您的應用程序),您可以重寫DOMWindow.setTimeout/.setInterval以支持字符串參數。您也可以爲jsdom開放一個問題來選擇加入。