gpt4 book ai didi

javascript - 某些 URL 的 Jsdom 抛出错误

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:30 26 4
gpt4 key购买 nike

我是 nodejs 的新手,我想做的是扫描我网站的所有 url(启用 javascript 和 jquery)并检查 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();
});
}
});

最佳答案

这是因为在您页面的某处,他们使用 Node 不支持的字符串调用 setTimeout/setInterval,这会导致该错误。

要找出它来自哪里,我建议只需要 longjohn module(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 提出一个问题以选择加入。

关于javascript - 某些 URL 的 Jsdom 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20625133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com