2013-12-17 5 views
5

私はnodejsを初めて使っています。私がやろうとしていることは、(javascriptとjqueryを有効にした)私のサイトのすべてのURLをスキャンし、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が関数でない場合は、エラーを投げてください。これは、問題のコードが実行されたときにはいつでもスローされます。

あなたが変更できないコードを実行している場合(あなたが所有していないウェブサイトのように、そのような外国のjavascriptがあなたのアプリを攻撃するために使用できないため)文字列引数をサポートするには、DOMWindow.setTimeout/.setIntervalをオーバーライドします。また、jsdomがこのオプトインを使用するための問題を公開することもできます。

関連する問題