我是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();
});
}
});
答案 0 :(得分: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可能会用来攻击你的app),您可以覆盖DOMWindow.setTimeout / .setInterval以支持字符串参数。你也可以为jsdom打开一个问题,让这个选择加入。