我是nodejs的新手,我正在尝试的是扫描我网站的所有网址(启用了
javascript和jquery)并检查网址是否包含给定的字符串.
要做到这一点,我使用jsdom,但是当我启动脚本时只提取一些网址,然后崩溃,发出此错误:
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,这会导致该错误.
为了找出它的来源,我建议只需要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.如果回调不是函数,则在那里抛出错误.每当有违规代码运行时,这将抛出.
如果您运行的代码无法更改(例如您不拥有的网站,我不建议使用这些代码,因为这样的外国javascript可用于攻击您的应用),您可以覆盖DOMWindow.setTimeout /.setInterval支持字符串参数.您也可以为jsdom打开一个问题,让这个选择加入.