2010-12-07 80 views
1

我試圖從運行簡單的例子代碼:與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(); 

誤差修改:

[email protected]:~/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?

回答

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對象,直到它工作。

+0

哦,狗屎。我道歉,jsdom工作正常,開發完成。使用PHP解析網頁會更好。 – Kir 2010-12-07 17:38:17

3

作爲一個澄清在這裏,你真正的問題在這裏:jsdom(html,{},{})。 jsdom()的第二個參數是一個級別(level1/core,level2/core,level2/html等)。通過傳遞一個空對象,你基本上可以告訴jsdom方法在沒有相應的W3c級別的情況下運行。