Jsdom抛出一些URL的错误

我是新的nodejs,我想要做的是扫描我的网站(使用javascript和jquery启用)的所有url,并检查该url是否包含给定的string。

要做到这一点我使用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(); }); } }); 

这是因为在你的页面的某个地方,他们正在调用setTimeout / setInterval和一个在节点中不受支持的string,并导致这个错误。

为了找出它来自哪里,我build议只需要longjohn模块( require('longjohn') ),并且你得到很长的堆栈跟踪,这将帮助你find错误。 例如,我在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) 

如果没有任何机会,或者你不喜欢它,那么我build议你修改这个jsdom文件:node_modules / jsdom / lib / jsdom / browser / index.js,函数startTimer。 如果callback不是函数,那么抛出一个错误。 这会抛出不良的代码运行。

如果你正在运行的代码,你不能改变(如从你不拥有的网站,我不build议这样做,因为外国JavaScript可以用来攻击你的应用程序),你可以重写DOMWindow.setTimeout /.setInterval支持string参数。 你也可以打开一个问题,让jsdom有这个select。