奇怪的错误与jsdom – node.js

我试图从例子运行简单的代码:

require.paths.unshift('/etc/npm'); // path to modules var httpAgent = require('http-agent'), jsdom = require('jsdom'), sys = require('sys'); var agent = httpAgent.create('www.twitter.com', ['', 'about']); agent.addListener('next', function (e, agent) { var body = agent.body; var window = jsdom.jsdom(body, {},{}).createWindow(); jsdom.jQueryify(window, 'http://code.jquery.com/jquery-1.4.2.js', function (window, jquery) { agent.next(); }); }); agent.addListener('stop', function (agent) { sys.puts('the agent has stopped'); }); agent.start(); 

但是它在这一行上返回了很多错误:

 var window = jsdom.jsdom(body, {},{}).createWindow(); 

误差修改:

 kir@nas:~/node$ node test.js /usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom/browser/index.js:197 if (!dom.HTMLDocument.write) { ^ TypeError: Cannot read property 'write' of undefined at Object.browserAugmentation (/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom/browser/index.js:197:24) at Object.jsdom (/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom.js:15:25) at EventEmitter.<anonymous> (/home/kir/node/test.js:12:22) at EventEmitter.emit (events:27:15) at Object.emit (/usr/local/lib/node/.npm/http-agent/0.1.0/package/lib/http-agent.js:180:41) at /usr/local/lib/node/.npm/http-agent/0.1.0/package/lib/http-agent.js:145:14 at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/request/0.10.0/package/lib/main.js:89:7) at IncomingMessage.emit (events:41:20) at HTTPParser.onMessageComplete (http:107:23) at Client.onData [as ondata] (http:848:27) 

我有稳定的node.js 0.2.5的Ubuntu 10.10。 WTF?

正常的jsom,它的工作正在进行中,DOM API是巨大的,重新实现所有的浏览器怪癖需要大量的时间。

但首先你要调用jsdom.jsdom(body, {},{}).createWindow(); 是错误的,第二个参数应该是一个完全configuration的DOM对象 ,如果你不提供一个只传递null使它回落到默认的。

但在此之后,它一直是乌龟。

Twitter例如做这个window.top.location ,事实certificate,jsdom没有定义window.top和BOOM!

解决这个问题,是啊,海龟。 错误不会停止,如果您有兴趣修复它,请打开<npm folder>/jsdom/0.1.21/package/lib/jsdom/level2/languages/javascript.js ,您可以login代码并修复window对象,直到它工作。

作为澄清在这里,你真正的问题在这里:jsdom(html, {} ,{})。 jsdom()的第二个参数是一个级别(level1 / core,level2 / core,level2 / html等)。 通过传递一个空对象,实质上是告诉jsdom方法在没有相应的W3c级别的情况下运行。