jsdom的奇怪错误 - node.js

时间:2010-12-07 15:12:02

标签: jquery 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();

Erros:

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)

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

2 个答案:

答案 0 :(得分:7)

正常的jsom,它正在进行中,DOM API是巨大的,并且重新实现所有浏览器怪癖需要花费很多时间。

但首先你的电话jsdom.jsdom(body, {},{}).createWindow();是错误的,第二个参数应该是完全配置DOM对象,如果你不提供一个只是传递null来制作它会回归到默认值。

但在那之后它一直是乌龟。

Twitter举例说明这个window.top.location,结果证明jsdom没有定义window.top和BOOM!

修复......是的,乌龟。错误不会停止,如果您有兴趣将其一直修复,请在那里打开<npm folder>/jsdom/0.1.21/package/lib/jsdom/level2/languages/javascript.js,您可以记录代码并修复window对象直到它工作。

答案 1 :(得分:3)

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